2010-11-21 18 views
87

Ho un grande indice solr e ho notato che alcuni campi non sono aggiornati correttamente (l'indice è dinamico).Come interrogare SOLR per campi vuoti?

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

ho provato queste query, ma non ha funzionato:

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

Esiste un modo per interrogare campi vuoti?

Grazie

risposta

114

Prova questo:

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

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

+2

Non '? Q = -id: *' funziona pure? – user2043553

+1

@ user2043553 No, se si '? Q = -id: *' si ottiene 'Can not parse '-q: *': '*' o '?' non consentito come primo carattere in WildcardQuery' –

63

Secondo SolrQuerySyntax, è possibile utilizzare q=-id:[* TO *].

+0

Questo ha funzionato per me in Solr 4.0 con un campo int. –

+1

Questo dovrebbe essere contrassegnato come la risposta corretta Vedi http://stackoverflow.com/questions/10722145/solr-how-do-i-construct-a-query-that-requires-a-not-null-location-field –

1

Se si utilizza 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 in classe QueryParameterCollection.cs, l'override ToString(), guarda se il parametro negativo è vero

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

Quando si chiama il creatore del parametro, se si tratta di un valore negativo. Semplice cambio del propertie

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

Se si dispone di un grande indice, è necessario utilizzare un valore predefinito

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

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

+0

Questo funziona solo per campi di tipo String? Come lo faresti per boolean? – jared

+0

Suppongo che dovrebbe funzionare allo stesso modo, ma non l'ho mai controllato –

2

Puoi anche usarlo in questo modo.

fq=!id:['' TO *] 
1

si può fare con la query di filtro q = *: * & FQ = -id: *

55

Un avvertimento! Se si desidera comporre questo tramite OR o AND non è possibile utilizzare in questa forma:

-myfield:* 

ma è necessario utilizzare

(*:* NOT myfield:*) 

Questa forma è perfettamente componibile. Apparentemente SOLR espanderà il primo modulo al secondo, ma solo quando è un nodo superiore. Spero che questo ti salvi un po 'di tempo!

+2

Questa risposta merita più punti di quanti ne abbia effettivamente. di tempo! – Zac

+0

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

+0

Sono d'accordo che questa dovrebbe essere la risposta accettata sulla domanda – tinker

Problemi correlati