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.