0

過去にこれが機能していたと99%確信していますが、間違っているかもしれません。

とにかく、保存されFieldているが分析されておらず、テキストが含まれている によって Lucene ドキュメントを削除したいと思います。

したがって、問題は、 で参照されているフィールドが であるか単純な数値luceneWriter.deleteDocuments(query)でない限り、 を呼び出しても文書が削除されないことのようです。queryField.Index.ANALYZED

いくつかのコード:

Integer myId = 1234;
Document doc = new Document();
Field field = new Field("MyIdField", myId, Field.Store.YES, Field.Index.ANALYZED);
doc.add(field);
indexWriter.add(doc);
indexWriter.commit();

...

QueryParser parser = new QueryParser(VERSION, "MyIdField", ANALYZER);
Query query = parser.parse("MyIdField:1234");
indexWriter.deleteDocuments(query);
indexWriter.commit();

すべてが機能します!
甘い..フィールドが分​​析されていない場合はどうなりますか?

Field field = new Field("MyIdField", myId, Field.Store.YES, Field.Index.NOT_ANALYZED);

まだ動作します!
すごい、ただの数字じゃなかったら?

Field field = new Field("MyIdField", "ID" + myId, Field.Store.YES, Field.Index.NOT_ANALYZED);
...
Query query = parser.parse("MyIdField:ID1234");

うまくいきません!
クエリはドキュメントと一致しないため、削除されません。
インデックスを作成したらどうなるでしょうか。

Field field = new Field("MyIdField", "ID" + myId, Field.Store.YES, Field.Index.ANALYZED);
...
Query query = parser.parse("MyIdField:ID1234");

それは再び動作します!

では、フィールドが分​​析されていなくても、数値のみが含まれている場合でも照会できますか? 何か不足していますか?

お時間をいただきありがとうございます。

注:
技術的には、2 つのフィールドがあり、ANDクエリになります。Queryそのため、ではなくを使用してドキュメントを削除することをお勧めしますTerm。それが違いを生むかどうかはわかりませんが、を使用したソリューションに固執したいと強調したかったのQueryです。

4

1 に答える 1

0

この質問によるとPhraseQuery、分析されていないフィールドを検索するには、を使用する必要があります。あなたのコード

Query query = parser.parse("MyIdField:ID1234");

代わりにa が生成TermQueryされるため、一致しません。

代わりに を試すことをお勧めしますKeywordAnalyzer(フィールドが分​​析されていなくても、クエリ パーサーはクエリ文字列を分析できるため、一致が失敗する可能性があることに注意してください)。

于 2013-03-12T13:59:50.140 に答える