2013-03-12 66 views
0

我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的解決方案。

回答

0

根據this question,您必須使用PhraseQuery來搜索未分析的字段。您的代碼

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

代替產生TermQuery,因此不會匹配。 (請記住,即使您的字段未被分析,查詢解析器仍然可以分析您的查詢字符串,因此您的匹配可能會失敗)。我們建議您嘗試使用KeywordAnalyzer

+0

謝謝,這個伎倆。我在我的問題中注意到我想用'AND'查詢中的多個列來處理這個問題,這是無法處理的。但是,我在索引中添加了一個新的'Field',所以我可以使用這個解決方案。我認爲長遠來看會更好。再次感謝。 – 2013-03-14 19:48:05