lucene
マルチタームクエリを使用した文書の削除
サーチ…
前書き
従来のSQLデータベースのように、ドキュメントに主キーフィールドがある場合、Luceneインデックスからドキュメントを削除するのは簡単です。
ただし、ドキュメント内の複数のフィールドに基づいていくつかのドキュメントを削除することが必要な場合があります。 Lucene APIでは、削除に使用するクエリを指定することで、これを実現できます。
これを行うには、適切なAnalyzerを選択し、クエリを作成し、クエリをindexWriterに渡してドキュメントを削除します。
構文
- indexWriter.deleteDocuments(multiTermQuery);
- クエリのMultiTermQuery =新しいQueryParser( ""、アナライザ).parse( "field_name1:"フィールド値1 "AND field_name2:"フィールド値2 "");
- BooleanQuery multiTermQuery =新しい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);
備考
アナライザの選択肢の警告
すぐには分かりませんが、使用しているアナライザーはクエリの実行方法に大きな違いをもたらします。これは、StandardAnalyzerが "the"や "a"のような一般的な英語の単語を除外するためです。別のアナライザー(KeywordAnalyzerなど)を選択して、正確に一致させることができます。これは明らかにもちろんLuceneのアプリケーションに依存します。
アナライザの選択
まず、どのアナライザを使用しているか注意してください。スタンダードアナライザーが '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);
クエリと一致するドキュメントを削除する
次に、最終的にライターにクエリを渡して、クエリに一致するドキュメントを削除します。
// 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);