How to create nested boolean query with lucene API

2019-02-03 14:28发布

I have an indexed object with three fields (userId, title, description). I want to find all objects of a specific user where the title OR the description contains a given keyword.

I have something like this (but that's obviously wrong):

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

How wo modify the code to get all objects with the correct ID and the search phrase in title or description?

标签: java api lucene
2条回答
祖国的老花朵
2楼-- · 2019-02-03 14:55

I think that it will be something like this:

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));
查看更多
唯我独甜
3楼-- · 2019-02-03 15:00

I believe that you'll need to use the Query.mergeBooleanQueries method in order to create a single query that is the effective OR of the first two.

So something like this at line 3:

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

and then create a new BooleanClause over this, rather than the individual clauses.

This should ensure you get the OR logic on your name/desc filters rather than the current AND logic.

查看更多
登录 后发表回答