使用布尔查询实现Lucene的OR搜索

14

我有一个包含多个字段的索引,其中一个是字符串字段,我在其中存储产品的类别名称,例如“电子产品”、“家居用品”、“园艺用品”等。

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

我正在进行一个布尔查询,通过名称、价格和类别查找产品,但我不确定如何进行OR搜索,以便可以同时查询两个类别。
我的当前查询如下所示:
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

这个在搜索一个类别时可以正常工作,但是我不确定如何搜索“电子产品或家居用品”,这将涉及两个类别。


2
@Ibear的答案是正确的,但你可能想阅读http://searchhub.org/dev/2011/12/28/why-not-and-or-and-not/以更好地了解Lucene中布尔逻辑的工作方式。 - mindas
@mindas,感谢链接,这确实非常有帮助。真希望能将其作为答案点赞,因为它非常有用。 - SoluableNonagon
1个回答

41

你可以这样写:

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
我希望我能够给这个多个赞。这个东西非常好用。 - SoluableNonagon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接