簡體   English   中英

如何在Lucene 4.10.0中刪除文檔(通過LongField)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM