我99%確定我在過去工作過,也許我錯了。通過查詢未分析文本字段刪除Lucene文檔
無論如何,我想用一個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");
不工作!.. darn。
查詢與文檔不匹配,因此不會被刪除。
如果我們做索引呢?
Field field = new Field("MyIdField", "ID" + myId, Field.Store.YES, Field.Index.ANALYZED);
...
Query query = parser.parse("MyIdField:ID1234");
它再次運作!
好的,所以如果該字段是未分析它仍然可以被查詢,如果它只包含一個數字?我錯過了什麼嗎?
感謝您花費一些時間。
注:
技術上講,有兩個領域,使它成爲一個AND
查詢。因此,我寧願刪除Query
而不是Term
的文檔。我不確定這是否有所作爲,但要強調我想堅持使用Query
的解決方案。
謝謝,這個伎倆。我在我的問題中注意到我想用'AND'查詢中的多個列來處理這個問題,這是無法處理的。但是,我在索引中添加了一個新的'Field',所以我可以使用這個解決方案。我認爲長遠來看會更好。再次感謝。 – 2013-03-14 19:48:05