我正在使用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的consconructor不允许Long值(并且使用"在#String中解析long的#34;并且没有工作)以及查询I&#39 ;我不太能干。任何帮助或建议真的很感激。
答案 0 :(得分:1)
您可以使用NumericRangeQuery删除一个或多个文档。相应地设置长范围,因为您要使用newLongRange
工厂方法。
答案 1 :(得分:1)
简单地将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
实际上仅供内部使用。但也许它确实阐明了为什么简单的串联方法不起作用。