Lucene: запросы и документы с несколькими полями - PullRequest
1 голос
/ 28 февраля 2011

У меня есть коллекция документов, состоящая из нескольких полей, и мне нужно выполнить запросы с несколькими терминами из нескольких полей.

Что вы предлагаете мне использовать?MultiFieldQueryParser или MultiPhraseQuery?

спасибо

Ответы [ 2 ]

1 голос
/ 28 февраля 2011
0 голосов
/ 13 мая 2017

Выбор анализатора

Прежде всего, следите за тем, какой анализатор вы используете. Некоторое время я был озадачен только тем, что понял, что StandardAnalyzer отфильтровывает такие общие слова, как «а» и «а». Это проблема, когда ваше поле имеет значение «A». Вы можете рассмотреть KeywordAnalyzer:

Смотрите этот пост вокруг анализатора.

// Create an analyzer:
// NOTE: We want the keyword analyzer so that it doesn't strip or alter any terms:
// In our example, the Standard Analyzer removes the term 'A' because it is a common English word.
// https://stackoverflow.com/a/9071806/231860
KeywordAnalyzer analyzer = new KeywordAnalyzer();

Парсер запросов

Далее вы можете создать свой запрос, используя QueryParser:

См. Этот пост о переопределении оператора по умолчанию.

// Create a query parser without a default field in this example (the first argument):
QueryParser queryParser = new QueryParser("", analyzer);

// Optionally, set the default operator to be AND (we leave it the default OR):
// https://stackoverflow.com/a/9084178/231860
// queryParser.setDefaultOperator(QueryParser.Operator.AND);

// Parse the query:
Query multiTermQuery = queryParser.parse("field_name1:\"field value 1\" AND field_name2:\"field value 2\"");

API запросов

Или вы можете достичь того же самого, создав запрос самостоятельно, используя их API:

См. Это руководство по созданию BooleanQuery.

BooleanQuery multiTermQuery = new BooleanQuery();
multiTermQuery.add(new TermQuery(new Term("field_name1", "field value 1")), BooleanClause.Occur.MUST);
multiTermQuery.add(new TermQuery(new Term("field_name2", "field value 2")), BooleanClause.Occur.MUST);

Удалить документы, соответствующие запросу

Затем мы наконец передаем запрос автору для удаления документов, соответствующих запросу:

Смотрите мой ответ здесь, связанный с этим ответом.

См. Ответ на этот вопрос.

// Remove the document by using a multi key query:
// http://www.avajava.com/tutorials/lessons/how-do-i-combine-queries-with-a-boolean-query.html
writer.deleteDocuments(multiTermQuery);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...