Поиск…


Вступление

Удаление документов из индекса Lucene легко, если у вас есть поле первичного ключа в вашем документе (например, в традиционных базах данных SQL).

Однако иногда удаление нескольких документов на основе нескольких полей в документе - это то, что вам нужно. API Lucene позволяет достичь этого, указав запрос на удаление.

Для этого выберите нужный анализатор, постройте запрос и передайте запрос indexWriter для удаления документов.

Синтаксис

  1. indexWriter.deleteDocuments (multiTermQuery);
  2. Query multiTermQuery = новый QueryParser ("", анализатор) .parse ("field_name1:" значение поля 1 "AND field_name2:" значение поля 2 "");
  3. BooleanQuery multiTermQuery = новый BooleanQuery (); multiTermQuery.add (новый TermQuery (новый термин («field_name1», «значение поля 1»)), BooleanClause.Occur.MUST); multiTermQuery.add (новый TermQuery (новый термин ("field_name2", "значение поля 2")), BooleanClause.Occur.MUST);

замечания

Предостережения с выбором анализатора

Это не сразу очевидно, но анализатор, который вы используете, имеет огромное значение для того, как выполняется ваш запрос. Это связано с тем, что StandardAnalyzer отфильтровывает распространенные английские слова типа «the» и «a». Возможно, вы захотите выбрать другой анализатор (например, KeywordAnalyzer), чтобы он точно соответствовал. Это, очевидно, зависит от вашего применения Lucene.

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

Прежде всего, следите за тем, какой анализатор вы используете. Некоторое время я был в тупике, чтобы понять, что StandardAnalyzer отфильтровывает общие слова, такие как «the» и «a». Это проблема, когда ваше поле имеет значение «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.
// http://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):
// http://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);

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

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

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

См. API здесь

// 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
indexWriter.deleteDocuments(multiTermQuery);


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow