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
Essaye ça:
?q=-id:["" TO *]
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!
Selon SolrQuerySyntax , vous pouvez utiliser q=-id:[* TO *]
.
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 *]
Vous pouvez aussi l'utiliser comme ça.
fq=!id:['' TO *]
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));
vous pouvez le faire avec la requête de filtrage q = *: * & fq = -id: *