поиск индекса lucene по нескольким полям - PullRequest
0 голосов
/ 17 января 2012

У меня есть индекс с 2 полями содержимого (проанализировано, проиндексировано и сохранено):
например: name, hobbies. (Поле хобби может быть добавлено несколько раз с разными значениями).

У меня есть другое поле, которое только проиндексировано (не проанализировано и не сохранено), используемое для фильтрации:
например: country_code

Теперь я хочу создать запрос, который будет извлекать документы, которые соответствуют (как можно лучше) некоторому полю ввода «поиск», но только в тех документах, где country_code имеет какое-то точное значение.

Какой синтаксис запроса / синтаксический анализатор запросов лучше всего использовать для создания такого запроса.

Ответы [ 2 ]

2 голосов
/ 18 января 2012

Вы можете использовать следующий запрос:

country_code:india +(name:search_value OR hobbies:search_value)
2 голосов
/ 17 января 2012

Почему бы вам не начать с QueryParser, это может работать для вашего варианта использования и требует минимальных усилий.

Непонятно из вашего вопроса, но давайте предположим, что у вас есть одно поле ввода («поиск») и поле со списком для кода страны.Затем вы прочитаете эти значения и создадите запрос:

// you don't have to use two parsers, you can do this using one.
QueryParser nameParser = new QueryParser(Version.LUCENE_CURRENT, "name", your_analyzer);
QueryParser hobbiesParser = new QueryParser(Version.LUCENE_CURRENT, "hobbies", your_analyzer);

BooleanQuery q = new BooleanQuery();
q.add(nameParser.parser(query), BooleanClause.Occur.SHOULD);
q.add(hobbiesParser.parser(query), BooleanClause.Occur.SHOULD);BooleanClause.Occur.SHOULD);

/* Filtering by country code can be done using a BooleanQuery 
 * or a filter, the difference will be how Lucene scores matches. 
 * For example, using a filter:
 */
Filter countryCodeFilter = new QueryWrapperFilter(new TermQuery(new Term("country_code", )));

//and finally searching:
TopDocs topDocs = searcher.search(q, countryCodeFilter, 10);
...