2013-03-12 68 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