web-dev-qa-db-fra.com

Comment interroger SOLR pour les champs vides?

J'ai un index Solr volumineux et j'ai remarqué que certains champs n'étaient pas mis à jour correctement (l'index est dynamique).

Cela a eu pour résultat que certains champs ont 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

104
user188962

Essaye ça:

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

Une mise en garde! Si vous voulez composer ceci via OR ou AND vous ne pouvez pas l'utiliser sous cette forme:

-myfield:*

mais vous devez utiliser

(*:* NOT myfield:*)

Cette forme est parfaitement composable. Apparemment, SOLR étendra le premier formulaire au second, mais seulement s'il s'agit d'un nœud supérieur. J'espère que cela vous fait gagner du temps!

77
KK1402

Selon SolrQuerySyntax , vous pouvez utiliser q=-id:[* TO *].

69
Yuval F

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

10
Matthias M

Vous pouvez aussi l'utiliser comme ça.

fq=!id:['' TO *]
2
user1976546

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

Vous devez changer 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 de ToString () recherche si le paramètre Negative est true.

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. Simple changement de la propriété

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

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

1
Nimrod Cohen