Как создать вложенный логический запрос с помощью lucene API (AND (b или c))? - PullRequest
12 голосов
/ 28 июня 2010

У меня есть индексированный объект с тремя полями (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));

Как это работает?изменить код, чтобы получить все объекты с правильным идентификатором и поисковой фразой в заголовке или описании?

Ответы [ 2 ]

22 голосов
/ 28 июня 2010

Я думаю, что это будет примерно так:

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));
0 голосов
/ 28 июня 2010

Я считаю, что вам нужно использовать метод Query.mergeBooleanQueries , чтобы создать один запрос, который будет эффективным ИЛИ для первых двух.

Так что-то вроде этогов строке 3:

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

, а затем создайте новый BooleanClause для этого, а не для отдельных предложений.

Это должно гарантировать, что вы получите логику ИЛИ в ваших фильтрах name / descа не текущая логика AND.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...