Как создать вложенный логический запрос с помощью lucene API (a AND (b OR c))?
У меня есть индексированный объект с тремя полями (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));
Как изменить код, чтобы получить все объекты с правильным идентификатором и поисковой фразой в названии или описании?
Ответы
Ответ 1
Я думаю, что это будет примерно так:
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));
Ответ 2
Я считаю, что вам нужно будет использовать метод Query.mergeBooleanQueries, чтобы создать единый запрос, который является эффективным OR первые два.
Так что-то вроде этого на линии 3:
Query nameOrDescQuery = Query.mergeBooleanQueries(new Query[] { nameQuery, descQuery });
а затем создайте для этого новый BooleanClause
, а не отдельные предложения.
Это должно гарантировать, что вы получите логику ИЛИ в ваших фильтрах имени /desc, а не в текущей логике И.