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.