2010-11-21 25 views
87

Ich habe einen großen Solr-Index, und ich habe festgestellt, dass einige Felder nicht korrekt aktualisiert werden (der Index ist dynamisch).Wie man SOLR für leere Felder abfragt?

Dies hat dazu geführt, dass einige Felder ein leeres "id" -Feld haben.

Ich habe diese Abfragen versucht, aber sie hat nicht funktioniert:

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

Gibt es eine Möglichkeit leere Felder abfragen?

Dank

Antwort

114

Try this:

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

Obwohl die SolrQuerySyntax-Seite sagt -id: [* TO *], nur -id: ["" TO *] arbeitete für mich auf solr 1.4. –

+2

Funktioniert '' q = -id: * 'auch nicht? – user2043553

+1

@ user2043553 Nein, wenn Sie '? Q = -id: *' Sie erhalten 'Kann nicht analysieren '-q: *': '*' oder '?' nicht erlaubt als erstes Zeichen in WildcardQuery' –

63

Nach SolrQuerySyntax können Sie q=-id:[* TO *] verwenden.

+0

Dies funktionierte für mich in Solr 4.0 mit einem int Feld. –

+1

Dies sollte markiert sein als die richtige Antwort Siehe http://stackoverflow.com/questions/10722145/solr-how-do-i-construct-a-query-that-requires-a-not-null-location-field –

1

Wenn Sie SolrSharp verwenden, werden negative Abfragen nicht unterstützt.

Sie müssen QueryParameter.cs ändern (Erstellen Sie einen neuen Parameter)

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

Und in QueryParameterCollection.cs Klasse, die ToString() überschreiben, sieht, wenn der negative Parameter wahr ist

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

Wenn Sie den Parameter Creator aufrufen, wenn es ein negativer Wert ist. Einfacher Wechsel der propertie

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

Wenn Sie einen großen Index haben, sollten Sie einen Standardwert verwenden

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

und dann für diesen Standardwert abfragen. Dies ist viel effizienter als q = -id: ["" TO *]

+0

Würde das nur funktionieren für Felder vom Typ String? Wie würdest du es für boolean machen? – jared

+0

Ich denke, es sollte genauso funktionieren. Aber ich habe es nie überprüft. –

2

Sie können es auch so verwenden.

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

Sie können es mit Filterabfrage q = *: * & fq = -id: *

55

Ein Nachteil! Wenn Sie dies über OR oder komponieren wollen, und Sie können es nicht in dieser Form verwenden:

-myfield:* 

aber Sie müssen

(*:* NOT myfield:*) 

Dieses Formular ist perfekt zusammensetzbare. Offenbar wird SOLR die erste Form auf die zweite erweitern, aber nur wenn es ein Top-Knoten ist. Hoffe das spart dir etwas Zeit!

+2

Diese Antwort verdient mehr Punkte als es tatsächlich hat.Sie ​​haben uns viel gerettet der Zeit! – Zac

+0

+1 hier auch. Ich implementierte die anderen Optionen, aber ich musste es in eine fq = anstelle von q = einschließen und musste auch ein OR implementieren, um zu überprüfen, ob das Feld leer war oder a hatte spezifischer Wert. Dies ist die einzige Option, die für diesen Anwendungsfall funktioniert hat. –

+0

Ich stimme zu, das sollte die akzeptierte Antwort auf die Frage sein – tinker

Verwandte Themen