0

我有 99% 的把握我过去有过这个工作,也许我错了。

无论如何,我想删除一个Field存储但未分析包含文本的 Lucene 文档。

所以问题似乎是调用luceneWriter.deleteDocuments(query)不会删除文档,除非引用的字段queryField.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");

不工作!...该死的。
查询与文档不匹配,因此不会被删除。
如果我们做索引呢?

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

它再次起作用!

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

感谢您抽出一些时间。

注意:
从技术上讲,有两个字段,使其成为AND查询。因此,我宁愿删除带有 aQuery而不是 a的文档Term。我不确定这是否会有所不同,但我想强调我想坚持使用Query.

4

1 回答 1

0

根据这个问题,您必须使用 aPhraseQuery来搜索未分析的字段。你的代码

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

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

I recommend you to try a KeywordAnalyzer instead (remember that, even if your field isn't analyzed, the query parser could still analyze your query string and therefore your match could fail anyway).

于 2013-03-12T13:59:50.140 回答