2009-03-11 7 views
73

Ich bin auf einer solr Abfrage ähnlich den folgenden Arbeiten:OR verwenden und NICHT in solr Abfrage

((myField:superneat AND myOtherField:somethingElse) OR NOT myField:superneat) 

Wenn dies ausgeführt wird, werden keine Ergebnisse zurückgegeben. Die Verwendung von Kriterien auf beiden Seiten des OR NOT gibt Ergebnisse zurück, die ich erwarten würde - sie funktionieren einfach nicht gut zusammen. In dem Fall, dass myField Spiele superneat, bin ich der Absicht, auch um sicherzustellen, dass myOtherField-somethingelse gesetzt, aber wenn myField ist nicht superneat, sind es in den Ergebnissen.

Kann jemand erklären, warum Solr Ergebnisse für diese Art von Abfrage nicht zurückgibt? Soll die Abfrage irgendwie umstrukturiert werden - oder gibt es eine andere Möglichkeit, mit solr das gewünschte Ergebnis zu erzielen?

Antwort

76

Ich weiß nicht, warum das nicht funktioniert, aber dieses ist logisch äquivalent und es tut Arbeit:

-(myField:superneat AND -myOtherField:somethingElse) 

Vielleicht hat es etwas mit der Definition dasselbe Feld zweimal in der zu tun Frage ...

Versuchen Sie, in der solr-user group Frage, dann posten Sie hier die endgültige Antwort zurück!

+0

Vielen Dank für Ihre Hilfe! Das funktioniert tatsächlich - und ich habe dies der solr-user-Gruppe gestellt. Ich werde hier alle nützlichen Dinge posten, die ich von ihnen höre. – stolenricecakes

+8

Beachten Sie, dass "-myField: superneat ODER myOtherField: somethingElse" auch gleich und etwas einfacher ist. –

+3

@YorickSijsling der Punkt ist, dass, obwohl logisch gleichwertig, Solr manchmal nicht sehr gut mit rein negativen Anfragen wie die, die das OP oder die Sie gepostet hat. –

8

können Sie finden die bis zum solr-Benutzergruppe folgen auf: solr user mailling list

Der vorherrschende Gedanke ist, dass der Operator NOT nur verwendet werden kann, ergibt sich aus einer Abfrage entfernen - nicht nur Dinge ausschließen aus dem gesamten Datensatz. Ich mag die von dir vorgeschlagene Syntax mausch - danke!

34
Instead of "NOT [condition]" use "(*:* NOT [condition])" 
+1

Vielen Dank! Dieser hat für mich auch bei komplexen Abfragen funktioniert, während - (myField: superneat AND -myOtherField: somethingElse) Ansatz - nicht! – dpetruha

27

Solr prüft zur Zeit für eine „reine Negativ“ Abfrage und fügt *:* (die alle Dokumente übereinstimmt), so dass es korrekt funktioniert.

-foo von solr in (*:* -foo)

Der große Nachteil transformiert wird, ist, dass Solr prüft, nur, wenn die Top-Level-Abfrage eine reine Negativ-Abfrage ist! Dies bedeutet also, dass eine Abfrage wie bar OR (-foo) nicht geändert wird, da die reine negative Abfrage in einer Unterklausel der Abfrage auf oberster Ebene ist. Sie müssen diese Abfrage verwandeln sich in bar OR (*:* -foo)

können Sie die solr Abfrage Erklärung überprüfen Sie die Abfrage Transformation zu überprüfen:

?q=-title:foo&debug=query 

zu

(+(-title:foo +MatchAllDocsQuery(*:*)) 
+1

Danke für die Erklärung! –

+1

* edismax * behandelt verschachtelte reine negative Abfragen richtig, richtig? Gab es Diskussionen darüber, den Lucene-Abfrageparser zu patchen, um diese auf die gleiche Weise zu unterstützen? –

19

verwandelt Putting zusammen Kommentare von ein paar verschiedene Antworten hier, in den Solr-Dokumenten und auf der anderen SO-Frage, fand ich, dass die folgende Syntax das richtige Ergebnis für meinen Anwendungsfall

erzeugt 210

(my_field = my_value oder my_field ist null):

(my_field:"my_value" OR (*:* NOT my_field:*)) 

Dies funktioniert für solr 4.1.0.Dies ist etwas anders als der Anwendungsfall im OP; aber ich dachte, dass andere es nützlich finden würden.

+1

Heute in genau diesem Szenario in Solr 5, und dieser Vorschlag funktioniert. –