Wie verwende ich boolesche Operatoren mit Hibernate Search?

8

Ich lerne die Hibernate Search Query-DSL , und ich bin nicht sicher, wie Abfragen mit boolean Argumenten zu konstruieren, wie AND oder OR.

Zum Beispiel, sagen wir mal, dass ich alle Person Datensätze zurückgeben möchten, die eine firstName Wert von „Rechnung“ oder „bob“ haben.

Nach den Ruhezustand-Dokumenten, die ein Beispiel verwendet die bool () Methode w / zwei Unterabfragen, wie:

%Vor%

Dies erzeugt letztlich die Lucene-Abfrage, die ich will, aber dann ist dies der richtige Weg, Boolesche Logik mit Hibernate Suche zu benutzen? Ist "soll ()" das Äquivalent von "ODER" (entspricht "muss ()" ebenfalls "UND") ?.

Auch das Schreiben einer Abfrage auf diese Weise ist mühsam. Zum Beispiel, was wäre, wenn ich eine Sammlung von FirstNames hätte, gegen die ich antreten könnte? Passt diese Art von Abfrage überhaupt zu der DSL?

    
NobodyMan 19.04.2012, 00:51
quelle

4 Antworten

3

Ja, Ihr Beispiel ist korrekt. Die booleschen Operatoren heißen sollte anstelle von OR wegen der Namen, die sie in der Lucene API und Dokumentation haben, und weil es passender ist: sie beeinflusst nicht nur einen booleschen Wert Entscheidung, aber es beeinflusst auch die Bewertung des Ergebnisses.

Wenn Sie zum Beispiel nach Autos der Marke "Fiat" oder "Blau" suchen, werden auch die Autos mit der Markenbezeichnung Fiat AND blue zurückgegeben und haben eine höhere Punktzahl als diejenigen, die blau, aber nicht Fiat sind.

Es könnte sich schwerfällig anfühlen, weil es programmatisch ist und viele detaillierte Optionen bietet. Eine einfachere Alternative besteht darin, eine einfache Zeichenfolge für Ihre Abfrage zu verwenden und den QueryParser zum Erstellen der Abfrage zu verwenden. Im Allgemeinen ist der Parser nützlich, um Benutzereingaben zu parsen, der programmatische ist leichter mit gut definierten Feldern umzugehen; Wenn Sie beispielsweise die von Ihnen erwähnte Sammlung haben, ist es einfach, sie in einer für Schleife zu erstellen.

    
Sanne 25.04.2012, 19:54
quelle
1

Um Ihre sekundäre Frage zu beantworten:

  

Zum Beispiel, was wäre, wenn ich eine Sammlung von firstNames hätte, mit denen ich zusammenspielen könnte?

Ich bin kein Experte, aber laut (das dritte Beispiel vom Ende) 5.1.2.1. Keyword-Abfragen in Hibernate Search-Dokumentation , sollten Sie in der Lage sein, die Abfrage wie folgt zu erstellen:

%Vor%

und hat als Ergebnis Person s mit ( firstName vorzugsweise "billy" oder "Bob") AND ( lastName ="thornton"), obwohl ich don‘ Ich denke, es wird dem guten alten Billy Bob Thornton eine höhere Punktzahl geben ;-).

    
ahpoblete 24.11.2012 08:09
quelle
1
___ answer10322792 ___

Ja, Ihr Beispiel ist korrekt. Die booleschen Operatoren heißen sollte anstelle von OR wegen der Namen, die sie in der Lucene API und Dokumentation haben, und weil es passender ist: sie beeinflusst nicht nur einen booleschen Wert Entscheidung, aber es beeinflusst auch die Bewertung des Ergebnisses.

Wenn Sie zum Beispiel nach Autos der Marke "Fiat" oder "Blau" suchen, werden auch die Autos mit der Markenbezeichnung Fiat AND blue zurückgegeben und haben eine höhere Punktzahl als diejenigen, die blau, aber nicht Fiat sind.

Es könnte sich schwerfällig anfühlen, weil es programmatisch ist und viele detaillierte Optionen bietet. Eine einfachere Alternative besteht darin, eine einfache Zeichenfolge für Ihre Abfrage zu verwenden und den QueryParser zum Erstellen der Abfrage zu verwenden. Im Allgemeinen ist der Parser nützlich, um Benutzereingaben zu parsen, der programmatische ist leichter mit gut definierten Feldern umzugehen; Wenn Sie beispielsweise die von Ihnen erwähnte Sammlung haben, ist es einfach, sie in einer für Schleife zu erstellen.

    
___ answer28957447 ​​___

Sie können auch BooleanQuery . Ich würde das vorziehen, weil Sie diese Schleife in einer Liste verwenden können.

%Vor%     
___ answer40470720 ___

Ich habe nach dem gleichen Thema gesucht und ein etwas anderes Thema als präsentiert. Ich suchte nach einer tatsächlichen %code% -Kreuzung. Der Soll-Fall funktionierte für mich nicht, da Ergebnisse, die keinen der beiden Ausdrücke bestanden hatten, jedoch mit einem niedrigeren Ergebnis bestanden. Ich wollte diese Ergebnisse komplett weglassen. Sie können jedoch einen tatsächlichen booleschen OR-Ausdruck erstellen, indem Sie einen separaten booleschen Ausdruck verwenden, für den Sie die Bewertung deaktivieren:

%Vor%     
___ qstnhdr ___ Wie verwende ich boolesche Operatoren mit Hibernate Search? ___ answer13539496 ___

Um Ihre sekundäre Frage zu beantworten:

  

Zum Beispiel, was wäre, wenn ich eine Sammlung von firstNames hätte, mit denen ich zusammenspielen könnte?

Ich bin kein Experte, aber laut (das dritte Beispiel vom Ende) 5.1.2.1. Keyword-Abfragen in Hibernate Search-Dokumentation , sollten Sie in der Lage sein, die Abfrage wie folgt zu erstellen:

%Vor%

und hat als Ergebnis %code% s mit ( %code% vorzugsweise "billy" oder "Bob") AND ( %code% ="thornton"), obwohl ich don‘ Ich denke, es wird dem guten alten Billy Bob Thornton eine höhere Punktzahl geben ;-).

    
___ qstntxt ___

Ich lerne die Hibernate Search Query-DSL , und ich bin nicht sicher, wie Abfragen mit boolean Argumenten zu konstruieren, wie AND oder OR.

Zum Beispiel, sagen wir mal, dass ich alle Person Datensätze zurückgeben möchten, die eine %code% Wert von „Rechnung“ oder „bob“ haben.

Nach den Ruhezustand-Dokumenten, die ein Beispiel verwendet die bool () Methode w / zwei Unterabfragen, wie:

%Vor%

Dies erzeugt letztlich die Lucene-Abfrage, die ich will, aber dann ist dies der richtige Weg, Boolesche Logik mit Hibernate Suche zu benutzen? Ist "soll ()" das Äquivalent von "ODER" (entspricht "muss ()" ebenfalls "UND") ?.

Auch das Schreiben einer Abfrage auf diese Weise ist mühsam. Zum Beispiel, was wäre, wenn ich eine Sammlung von FirstNames hätte, gegen die ich antreten könnte? Passt diese Art von Abfrage überhaupt zu der DSL?

    
___ tag123java ___ Java (nicht zu verwechseln mit JavaScript oder JScript oder JS) ist eine universelle objektorientierte Programmiersprache, die für die Verwendung in Verbindung mit der Java Virtual Machine (JVM) entwickelt wurde. "Java-Plattform" ist der Name für ein Computersystem, auf dem Tools zum Entwickeln und Ausführen von Java-Programmen installiert sind. Verwenden Sie dieses Tag für Fragen, die sich auf die Java-Programmiersprache oder Java-Plattform-Tools beziehen. ___ tag123hibernatesearch ___ Hibernate Search ist ein Hibernate-Unterprojekt, das die Synchronisierung zwischen Entitäten ermöglicht, die von Hibernate ORM verwaltet werden, und Volltextindizierungsdiensten wie Apache Lucene und Elasticsearch ___
vinay 10.03.2015 06:30
quelle
1

Ich habe nach dem gleichen Thema gesucht und ein etwas anderes Thema als präsentiert. Ich suchte nach einer tatsächlichen OR -Kreuzung. Der Soll-Fall funktionierte für mich nicht, da Ergebnisse, die keinen der beiden Ausdrücke bestanden hatten, jedoch mit einem niedrigeren Ergebnis bestanden. Ich wollte diese Ergebnisse komplett weglassen. Sie können jedoch einen tatsächlichen booleschen OR-Ausdruck erstellen, indem Sie einen separaten booleschen Ausdruck verwenden, für den Sie die Bewertung deaktivieren:

%Vor%     
quelle

Tags und Links