2013-11-25 15 views
8

Ich habe einen Index mit mehreren Feldern, von denen eines ist ein String-Feld, in dem ich Kategorienamen für ein Produkt speichern ... wie "Elektronik", "Home", "Garten", etcLucene ODER Suche mit boolescher Abfrage

new StringField("category_name", categoryName, Field.Store.YES)); //categoryName is a value such as "Electronics" 

ich eine Boolesche Abfrage bin befindliche Produkte mit Namen, Preis zu finden, und Kategorie, aber ich bin nicht sicher, wie eine ODER-Suche zu tun, so dass ich für zwei Kategorien zur gleichen Zeit abfragen.

Meine aktuelle Abfrage sieht wie folgt aus:

String cat = "Electronics" 
TermQuery catQuery = new TermQuery(new Term("category_name", cat)); 
bq.add(new BooleanClause(catQuery, BooleanClause.Occur.MUST)); // where "bq" is the boolean query I am adding to, I tried .SHOULD but that didn't help either 

das funktioniert für eine Kategorie suchen in Ordnung, aber ich bin nicht sicher, wie „Elektronik oder zu Hause“ suchen, die zwei Kategorien sein würde.

+2

@ Ibear Antwort ist richtig, aber Sie könnten http://searchhub.org/dev/2011/12/28/why-not-and-or lesen möchten -and-not/zum besseren Verständnis, wie boolesche Logik in Lucene funktioniert. – mindas

+0

@mindas, danke für den Link, der hilft auch sehr viel. Ich wünschte, ich könnte das als Antwort abstimmen, weil es wirklich nützlich ist. – SoluableNonagon

Antwort

22

Sie können wie schreiben:

BooleanQuery categoryQuery = new BooleanQuery(); 
TermQuery catQuery1 = new TermQuery(new Term("category_name", "Electronics")); 
TermQuery catQuery2 = new TermQuery(new Term("category_name", "Home")); 
categoryQuery.add(new BooleanClause(catQuery1, BooleanClause.Occur.SHOULD)); 
categoryQuery.add(new BooleanClause(catQuery2, BooleanClause.Occur.SHOULD)); 
bq.add(new BooleanClause(categoryQuery, BooleanClause.Occur.MUST)); 
+2

Ich wünschte, ich könnte diese multiplen Stimmen geben. Das funktioniert wie ein Zauber. – SoluableNonagon

+0

* Genau * was ich brauchte und nicht in der Dokumentation finden konnte. –