【发布时间】:2013-03-12 12:57:07
【问题描述】:
我 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();
一切正常!
Sweet.. 如果不分析该字段怎么办?
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");
它又工作了!
好的,那么如果该字段没有分析,如果它只包含一个数字,它仍然可以被查询吗?我错过了什么吗?
感谢您抽出时间。
注意:
从技术上讲,有两个字段,使其成为AND 查询。因此,我宁愿删除带有Query 而不是Term 的文档。我不确定这是否会有所不同,但我想强调我想坚持使用Query 的解决方案。
【问题讨论】: