gpt4 book ai didi

java - 如何在 lucene 4.10.0 中删除文档(通过 LongField)

转载 作者:行者123 更新时间:2023-11-30 08:20:16 25 4
gpt4 key购买 nike

我正在使用 Lucene 4.10.0,我想知道如何通过 LongField 删除文档。在实践中,我索引由唯一 ID(类似于 ISBN)标识的文档。我用 LongField 存储 id:

doc.add(new LongField(Book.ID, item.getISBN(),Field.Store.YES));

如何通过这个唯一的 id 删除它?

我知道我的版本存在方法

 deleteDocuments(Query queries)

deleteDocuments(Term terms)

属于 IndexWriter 类,但是 Term 的构造函数不允许 Long 值(并且在 String 中使用解析 long 的“技巧”不起作用)并且对于查询我不太能干。非常感谢任何帮助或建议。

最佳答案

简单地将 Long 转换为字符串是行不通的,因为 Lucene 对数字类型使用特殊编码。因此,您应该使用查询。 NumericRangeQuery具体来说。像这样的东西:

Query query = NumericRangeQuery.newLongRange(Book.ID, item.getISBN(), item.getISBN(), true, true)
writer.deleteDocuments(query);

对于一个兴趣点,为了使用术语而不是查询来删除,您需要使用 NumericUtils 将数字转换为 lucene 的前缀编码字符串表示形式,例如:

BytesRefBuilder bytes = new BytesRefBuilder();
NumericUtils.longToPrefixCoded(item.getISBN(), 0, bytes);
Term term = new Term(Book.ID, bytes.toBytesRef());
writer.deleteDocuments(term);

不过,您通常不应该这样做。 NumericUtils 实际上仅供内部使用。但也许它确实阐明了为什么简单的字符串方法不起作用。

关于java - 如何在 lucene 4.10.0 中删除文档(通过 LongField),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26185193/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com