Verwenden von OR und NOT in der Solr-Abfrage


82

Ich arbeite an einer solr-Abfrage ähnlich der folgenden:

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

Wenn Sie dies ausführen, werden keine Ergebnisse zurückgegeben. Die Verwendung von Kriterien auf beiden Seiten von OR NOT liefert die erwarteten Ergebnisse - sie arbeiten einfach nicht gut zusammen. Für den Fall, dass myField mit Superneat übereinstimmt , möchte ich auch sicherstellen, dass myOtherField auf etwas anderes eingestellt ist. Wenn myField jedoch nicht Superteat ist , nehmen Sie es in die Ergebnisse auf.

Kann jemand erklären, warum solr für diese Art von Abfrage keine Ergebnisse zurückgibt? Sollte die Abfrage irgendwie umstrukturiert werden - oder gibt es eine andere Art und Weise, wie solr verwendet werden kann, um das gewünschte Ergebnis zu erzielen?

Antworten:


82

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

-(myField:superneat AND -myOtherField:somethingElse)

Vielleicht hat es etwas damit zu tun, dass dasselbe Feld zweimal in der Abfrage definiert wird ...

Fragen Sie in der Solr-User-Gruppe nach und geben Sie hier die endgültige Antwort zurück!


Danke für Ihre Hilfe! Dies funktioniert in der Tat - und ich habe dies der Solr-User-Gruppe vorgelegt. Ich werde alle nützlichen Dinge, die ich von ihnen höre, hier posten.
gestohlene Reiswürfel

8
Beachten Sie, dass -myField:superneat OR myOtherField:somethingElsedies auch gleich wäre und etwas einfacher ist.
Yorick Sijsling

3
@YorickSijsling der Punkt ist, dass Solr, obwohl logisch äquivalent, manchmal nicht sehr gut mit rein negativen Abfragen wie der, die das OP gepostet hat oder der, die Sie gepostet haben, zurechtkommt.
Mauricio Scheffer

@ Mauricio Scheffer - das würde ich ganz in Frage stellen. Könnten Sie mehr darüber erklären, wie es nicht sehr gut zurechtkommt? Wir haben hier ziemlich komplexe Bedingungen ausgeführt und festgestellt, dass sie mit Milliarden von Dokumenten sehr gut zurechtkommen.
Terrance.a.snyder

@ terrance.a.snyder "komplexe Bedingungen"! = "rein negative Abfragen". Außerdem haben sich die Dinge in den letzten Versionen von Solr möglicherweise verbessert. Ich habe dies nicht überprüft.
Mauricio Scheffer

41
Instead of "NOT [condition]" use "(*:* NOT [condition])"

1
Vielen Dank! Dieser funktionierte für mich auch bei komplexen Abfragen, während - (myField: superneat AND -myOtherField: SomethingElse) Ansatz - nicht!
Dpetruha

33

Solr sucht derzeit nach einer "rein negativen" Abfrage und fügt sie ein *:*(was mit allen Dokumenten übereinstimmt), damit sie ordnungsgemäß funktioniert.

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

Die große Einschränkung ist, dass Solr nur prüft, ob die Abfrage der obersten Ebene eine rein negative Abfrage ist! Dies bedeutet also, dass eine Abfrage wie bar OR (-foo)nicht geändert wird, da sich die reine negative Abfrage in einem Unterabschnitt der Abfrage der obersten Ebene befindet. Sie müssen diese Abfrage selbst in transformierenbar OR (*:* -foo)

Sie können die Erklärung der solr-Abfrage überprüfen, um die Abfragetransformation zu überprüfen:

?q=-title:foo&debug=query

verwandelt sich in

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

1
edismax behandelt verschachtelte rein negative Abfragen korrekt, oder? Hat es Diskussionen darüber gegeben, den Lucene-Abfrageparser zu patchen, um diese auf die gleiche Weise zu unterstützen?
Peter Dixon-Moses

24

Beim Zusammenstellen von Kommentaren aus verschiedenen Antworten hier, in den Solr-Dokumenten und bei der anderen SO-Frage stellte ich fest, dass die folgende Syntax das richtige Ergebnis für meinen Anwendungsfall liefert

(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 unterscheidet sich geringfügig vom Anwendungsfall im OP. aber ich dachte, dass andere es nützlich finden würden.


1
Ist heute in Solr 5 genau auf dieses Szenario gestoßen, und dieser Vorschlag funktioniert.
Ryan Shelley

9

Das Follow-up zur Solr-User-Gruppe finden Sie unter: Solr User Mailling List

Der vorherrschende Gedanke ist, dass der Operator NOT nur zum Entfernen von Ergebnissen aus einer Abfrage verwendet werden darf - und nicht nur Dinge aus dem gesamten Datensatz ausschließt. Ich mag zufällig die Syntax, die Sie mausch vorgeschlagen haben - danke!


3

Um einen weiteren unerwarteten Fall hinzuzufügen, folgt eine Abfrage, die keine erwarteten Ergebnisse zurückgibt:

*:* AND ( ( field_a:foo AND field_b:bar ) OR !field_b:bar )

field_bIn meinem Fall führe ich Facettierungen durch und musste den Abfragebegriff "foo" nur auf diesen Typ (Balken) ausrichten.

Ich musste nach der oder Bedingung eine weitere einfügen *:*, damit dies funktioniert:

*:* AND ( ( field_a:foo AND field_b:bar ) OR ( *:* AND !field_b:bar ) )

edit: das ist in solr 6.6.3


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.