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

Antworten:


143

Versuche dies:

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

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!


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 *]


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


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.