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

Réponses:


144

Essaye ça:

?q=-id:["" TO *]

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!


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 *]


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


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));

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.