2010-06-28 7 views
12

Ich habe ein indiziertes Objekt mit drei Feldern (userId, Titel, Beschreibung). Ich möchte alle Objekte eines bestimmten Benutzers finden, wobei der Titel ODER die Beschreibung ein bestimmtes Schlüsselwort enthält.Wie erstellt man eine verschachtelte boolesche Abfrage mit Lucene API (a UND (b OR c))?

Ich habe so etwas wie dies (aber das ist offensichtlich falsch):

WildcardQuery nameQuery = new WildcardQuery(new Term("name", filter.getSearch())); 
WildcardQuery descQuery = new WildcardQuery(new Term("description", filter.getSearch())); 

TermQuery userQuery = new TermQuery(new Term("user_id", u.getId()+"")); 

BooleanQuery booleanQuery = new BooleanQuery(); 
booleanQuery.add(new BooleanClause(name_query, Occur.SHOULD)); 
booleanQuery.add(new BooleanClause(desc_query, Occur.SHOULD)); 
booleanQuery.add(new BooleanClause(user_query, Occur.MUST)); 

Wie Sie den Code ändern Vorspiel alle Objekte mit der richtigen ID und dem Suchbegriff in Titel oder die Beschreibung zu bekommen?

Antwort

22

Ich denke, dass es so etwas wie das sein wird:

TermQuery userQuery = new TermQuery(new Term("user_id", u.getId()+"")); 

BooleanQuery orQuery = new BooleanQuery(); 
orQuery.add(new BooleanClause(name_query, Occur.SHOULD)); 
orQuery.add(new BooleanClause(desc_query, Occur.SHOULD)); 

BooleanQuery andQuery = new BooleanQuery(); 
andQuery.add(new BooleanClause(userQuery , Occur.MUST)); 
andQuery.add(new BooleanClause(orQuery, Occur.MUST)); 
0

Ich glaube, dass Sie die Query.mergeBooleanQueries Methode, um verwenden müssen, um es eine einzelne Abfrage zu erstellen, die die effektive ODER-Verknüpfung der ersten beiden ist.

So etwas wie dies in Zeile 3:

Query nameOrDescQuery = Query.mergeBooleanQueries(new Query[] { nameQuery, descQuery }); 

und dann eine neue BooleanClause über diese zu schaffen, anstatt die einzelnen Klauseln.

Dies sollte sicherstellen, dass Sie die OR-Logik auf Ihrem Namen/DESC-Filter statt der aktuellen UND-Logik erhalten.

Verwandte Themen