過去にこれが機能していたと99%確信していますが、間違っているかもしれません。
とにかく、保存されField
ているが分析されておらず、テキストが含まれている によって Lucene ドキュメントを削除したいと思います。
したがって、問題は、 で参照されているフィールドが であるか単純な数値luceneWriter.deleteDocuments(query)
でない限り、 を呼び出しても文書が削除されないことのようです。query
Field.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
です。