通过查询未分析的文本字段删除Lucene文档

时间:2013-03-12 12:57:07

标签: java lucene

我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");

不起作用!.. darn 查询与文档不匹配,因此不会被删除 如果我们做索引会怎么样?

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

再次有效!

好的,如果该字段未分析,如果它只包含一个数字,仍然可以查询它?我错过了什么吗?

感谢您抽出一些时间。

注意:
从技术上讲,有两个字段,使其成为AND查询。因此,我更愿意删除Query而不是Term的文档。我不确定这是否有所作为,但我想强调我想坚持使用Query的解决方案。

1 个答案:

答案 0 :(得分:0)

根据this question,您必须使用PhraseQuery来搜索未分析的字段。你的代码

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

会产生TermQuery,因此不会匹配。

我建议您尝试使用KeywordAnalyzer(请记住,即使您的字段未分析,查询解析器仍然可以分析您的查询字符串,因此您的匹配可能会失败)。