【问题标题】:Remove Lucene document by query of not analyzed text field通过查询未分析的文本字段删除 Lucene 文档
【发布时间】: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 的解决方案。

【问题讨论】:

    标签: java lucene


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢,成功了。我的问题中有一条注释,我想在 AND 查询中处理多个列,这是无法处理的。但是,我在我的索引中添加了一个新的Field,所以我可以使用这个解决方案。我认为从长远来看它会更好。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2016-08-02
    • 2019-07-11
    • 1970-01-01
    • 2015-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多