Wie frage ich SOLR nach leeren Feldern ab?

112

Ich habe einen großen Solr-Index und habe festgestellt, dass einige Felder nicht korrekt aktualisiert wurden (der Index ist dynamisch).

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

Ich habe diese Abfragen ausprobiert, aber sie haben nicht funktioniert:

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

Gibt es eine Möglichkeit, leere Felder abzufragen?

Vielen Dank

Eric Wilson
quelle

Antworten:

143

Versuche dies:

?q=-id:["" TO *]
Netcoder
quelle
7
Obwohl auf der SolrQuerySyntax-Seite -id: [* TO *] steht, hat bei solr 1.4 nur -id: ["" TO *] für mich funktioniert.
Jonathan Tran
1
@ user2043553 Nein, wenn Sie ?q=-id:*bekommenCannot parse '-q:*': '*' or '?' not allowed as first character in WildcardQuery
Yzmir Ramirez
1
@YzmirRamirez Ich habe es mit dem Beispiel von Solr 4.5.1 versucht und ?q=-id:*scheint wie erwartet zu funktionieren. Möglicherweise hängt der Analysefehler mit diesem Problem zusammen .
user2043553
Sorry, habe die Version vergessen ... Lucene Specification Version: 3.2.0Ich habe sie benutzt. Ich bin froh, dass sie die Syntax in Solr 4.5.1 hinzugefügt haben.
Yzmir Ramirez
Beachten Sie, dass diese Syntax auch Zeilen zurückzugeben scheint, deren
Feldwert
89

Eine Einschränkung! Wenn Sie dies über ODER oder UND verfassen möchten, können Sie es nicht in dieser Form verwenden:

-myfield:*

aber du musst verwenden

(*:* NOT myfield:*)

Diese Form ist perfekt zusammensetzbar. Anscheinend wird SOLR das erste Formular auf das zweite erweitern, aber nur, wenn es sich um einen obersten Knoten handelt. Hoffe das spart dir etwas Zeit!

KK1402
quelle
2
Diese Antwort verdient mehr Punkte als sie tatsächlich hat. Sie haben uns viel Zeit gespart!
Zac
+1 auch hier. Ich habe die anderen Optionen implementiert, musste sie jedoch in ein fq = anstelle von q = einfügen und ein ODER implementieren, um zu überprüfen, ob das Feld leer war ODER einen bestimmten Wert hatte. Dies ist die einzige Option, die für diesen Anwendungsfall funktioniert hat.
Pixelmixer
Ich bin damit einverstanden, dass dies die akzeptierte Antwort auf die Frage sein sollte
basteln Sie
Du hast mir so viele Kopfschmerzen erspart. Ich bin mir nicht sicher, ob Danke ausreicht.
Camway
11

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

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

und fragen Sie dann nach diesem Standardwert. Dies ist viel effizienter als q = -id: ["" TO *]

Matthias M.
quelle
Würde dies nur für Felder vom Typ String funktionieren? Wie würden Sie es für Boolesche tun?
Jared
Ich denke, es sollte genauso funktionieren. Aber ich habe es nie überprüft.
Matthias M
2

Sie können es auch so verwenden.

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

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

Sie müssen QueryParameter.cs ändern (Neuen Parameter erstellen)

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

In der QueryParameterCollection.cs-Klasse prüft die ToString () - Überschreibung, ob der negative Parameter wahr ist

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

Wenn Sie den Parameterersteller aufrufen, wenn es sich um einen negativen Wert handelt. Ändern Sie einfach die Eigenschaft

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

Sie können dies mit der Filterabfrage q = *: * & fq = -id: * tun

Nimrod Cohen
quelle