如何使用lucene API(AND(b OR c))创建嵌套的布尔查询?

时间:2010-06-28 08:15:13

标签: java api lucene

我有一个带三个字段的索引对象(userId,title,description)。我想找到特定用户的所有对象,其中标题或描述包含给定的关键字。

我有类似的东西(但这显然是错的):

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));

如何修改代码以获取标题或描述中具有正确ID和搜索短语的所有对象?

2 个答案:

答案 0 :(得分:22)

我认为会是这样的:

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));

答案 1 :(得分:0)

我相信您需要使用Query.mergeBooleanQueries方法才能创建一个前两个查询的有效OR。

第3行就是这样的事情:

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

然后为此创建一个新的BooleanClause,而不是单个子句。

这应确保您在名称/ desc过滤器上获得OR逻辑,而不是当前的AND逻辑。