Come interrogare SOLR per i campi vuoti?


112

Ho un indice solr grande e ho notato che alcuni campi non vengono aggiornati correttamente (l'indice è dinamico).

Ciò ha comportato che alcuni campi presentassero un campo "id" vuoto.

Ho provato queste query, ma non hanno funzionato:

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

C'è un modo per interrogare i campi vuoti?

Grazie

Risposte:


144

Prova questo:

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

7
Anche se la pagina SolrQuerySyntax dice -id: [* TO *], solo -id: ["" TO *] ha funzionato per me su solr 1.4.
Jonathan Tran

1
@ user2043553 No, se ?q=-id:*ottieniCannot parse '-q:*': '*' or '?' not allowed as first character in WildcardQuery
Yzmir Ramirez

1
@YzmirRamirez Ho provato con l'esempio di Solr 4.5.1 e ?q=-id:*sembra funzionare come previsto. Forse l'errore di analisi è correlato a questo problema .
user2043553

Scusa, Lucene Specification Version: 3.2.0ho dimenticato la versione ... stavo usando. Sono contento che abbiano aggiunto la sintassi in Solr 4.5.1.
Yzmir Ramirez

Attenzione che questa sintassi sembra restituire anche righe il cui valore del campo inizia con uno spazio bianco (in Solr 4.3)
metatechbe

89

Un avvertimento! Se vuoi comporlo tramite OR o AND non puoi usarlo in questo modulo:

-myfield:*

ma devi usare

(*:* NOT myfield:*)

Questa forma è perfettamente componibile. Apparentemente SOLR espanderà la prima forma alla seconda, ma solo quando è un nodo superiore. Spero che questo ti faccia risparmiare tempo!


2
Questa risposta merita più punti di quanti ne abbia effettivamente. Ci hai risparmiato un sacco di tempo!
Zac

+1 anche qui. Ho implementato le altre opzioni ma ho dovuto includerlo in fq = piuttosto che q = e ho anche dovuto implementare un OR per verificare se il campo era vuoto OR aveva un valore specifico. Questa è l'unica opzione che ha funzionato per quel caso d'uso.
Pixelmixer

Sono d'accordo che questa dovrebbe essere la risposta accettata alla domanda
armeggiare

Mi hai risparmiato così tanto mal di testa. Non sono sicuro che grazie sia sufficiente.
Camway


11

Se hai un indice di grandi dimensioni, dovresti utilizzare un valore predefinito

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

e quindi eseguire una query per questo valore predefinito. È molto più efficiente di q = -id: ["" TO *]


Funzionerebbe solo per i campi di tipo String? Come lo faresti per booleano?
jared

Immagino che dovrebbe funzionare allo stesso modo. Ma non l'ho mai controllato.
Matthias M


1

Se stai usando SolrSharp, non supporta le query negative.

È necessario modificare QueryParameter.cs (creare un nuovo parametro)

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

E nella classe QueryParameterCollection.cs, l'override di ToString () controlla se il parametro Negative è vero

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

Quando chiami il creatore del parametro, se è un valore negativo. Modifica semplice la proprietà

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.