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

时间:2014-10-03 19:05:33

标签: java lucene

我正在使用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 ;我不太能干。任何帮助或建议真的很感激。

2 个答案:

答案 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实际上仅供内部使用。但也许它确实阐明了为什么简单的串联方法不起作用。