Comment interroger SOLR pour les champs vides?

112

J'ai un gros index solr, et j'ai remarqué que certains champs ne sont pas mis à jour correctement (l'index est dynamique).

Cela a abouti à certains champs ayant un champ "id" vide.

J'ai essayé ces requêtes, mais elles n'ont pas fonctionné:

 id:''
 id:NULL
 id:null
 id:""
 id:
 id:['' TO *]

Existe-t-il un moyen d'interroger les champs vides?

Merci

Eric Wilson
la source

Réponses:

144

Essaye ça:

?q=-id:["" TO *]
netcoder
la source
7
Même si la page SolrQuerySyntax dit -id: [* TO *], seul -id: ["" TO *] a fonctionné pour moi sur solr 1.4.
Jonathan Tran
1
@ user2043553 Non, si vous ?q=-id:*obtenezCannot parse '-q:*': '*' or '?' not allowed as first character in WildcardQuery
Yzmir Ramirez
1
@YzmirRamirez J'ai essayé avec l'exemple de Solr 4.5.1 et ?q=-id:*semble fonctionner comme prévu. Peut-être que l'erreur d'analyse est liée à ce problème .
user2043553
Désolé, j'ai oublié la version que Lucene Specification Version: 3.2.0j'utilisais. Heureux d'avoir ajouté la syntaxe de Solr 4.5.1.
Yzmir Ramirez
Attention, cette syntaxe semble également renvoyer des lignes dont la valeur de champ commence par un espace (dans Solr 4.3)
metatechbe
89

Une mise en garde! Si vous souhaitez composer ceci via OU ou ET vous ne pouvez pas l'utiliser sous cette forme:

-myfield:*

mais vous devez utiliser

(*:* NOT myfield:*)

Cette forme est parfaitement composable. Apparemment, SOLR étendra la première forme à la seconde, mais uniquement lorsqu'il s'agit d'un nœud supérieur. J'espère que cela vous fera gagner du temps!

KK1402
la source
2
Cette réponse mérite plus de points qu'elle n'en a réellement. Vous nous avez fait gagner beaucoup de temps!
Zac
+1 ici aussi. J'ai implémenté les autres options mais j'ai dû l'inclure dans un fq = plutôt que q = et j'ai également dû implémenter un OR pour vérifier si le champ était vide OU avait une valeur spécifique. C'est la seule option qui a fonctionné pour ce cas d'utilisation.
Pixelmixer
Je suis d'accord que cela devrait être la réponse acceptée à la question
bricoler
Vous m'avez sauvé tant de maux de tête. Je ne suis pas sûr que le remerciement soit suffisant.
Camway
11

Si vous avez un index volumineux, vous devez utiliser une valeur par défaut

   <field ... default="EMPTY" />

puis interrogez cette valeur par défaut. C'est beaucoup plus efficace que q = -id: ["" TO *]

Matthias M
la source
Cela ne fonctionnerait-il que pour les champs de type String? Comment le feriez-vous pour booléen?
jared
Je suppose que cela devrait fonctionner de la même manière. Mais je ne l'ai jamais vérifié.
Matthias M
2

Vous pouvez également l'utiliser comme ça.

fq=!id:['' TO *]
user1976546
la source
1

Si vous utilisez SolrSharp, il ne prend pas en charge les requêtes négatives.

Vous devez modifier QueryParameter.cs (créer un nouveau paramètre)

private bool _negativeQuery = false;

public QueryParameter(string field, string value, ParameterJoin parameterJoin = ParameterJoin.AND, bool negativeQuery = false)
{
    this._field = field;
    this._value = value.Trim();
    this._parameterJoin = parameterJoin;
    this._negativeQuery = negativeQuery;
}

public bool NegativeQuery
{
    get { return _negativeQuery; }
    set { _negativeQuery = value; }
}

Et dans la classe QueryParameterCollection.cs, le remplacement ToString () vérifie si le paramètre Negative est vrai

arQ[x] = (qp.NegativeQuery ? "-(" : "(") + qp.ToString() + ")" + (qp.Boost != 1 ? "^" + qp.Boost.ToString() : "");

Lorsque vous appelez le créateur du paramètre, s'il s'agit d'une valeur négative. Changez simplement la propriété

List<QueryParameter> QueryParameters = new List<QueryParameter>();
QueryParameters.Add(new QueryParameter("PartnerList", "[* TO *]", ParameterJoin.AND, true));
Adriano Galesso Alves
la source
1

vous pouvez le faire avec la requête de filtre q = *: * & fq = -id: *

Nimrod Cohen
la source