[英]how to delete a document (by LongField) in lucene 4.10.0
我正在使用Lucene 4.10.0,我想知道如何通過LongField刪除文檔。 在實踐中,我會索引由唯一ID(類似於ISBN)標識的文檔。 我將ID存儲在LongField中:
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
實際上僅供內部使用。 但這也許可以說明為什么簡單的字符串方法不起作用。
您可以使用NumericRangeQuery刪除一個或多個文檔。 為此,請設置長距離,以使用newLongRange
工廠方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.