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

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

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

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的所有对象以及标题或描述中的搜索短语?

我认为它会是这样的:

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

我相信您需要使用Query.mergeBooleanQueries方法来创建单个查询,该查询是前两个查询的有效OR。

在第3行是这样的:

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

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

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