[英]How to get a list of all tokens from Lucene 8.6.1 index?
我已經看過如何從 Solr/Lucene 索引中獲取所有令牌的列表? 但是 Lucene 8.6.1 似乎沒有提供IndexReader.terms()
。 它被移動或更換了嗎? 有比這個答案更簡單的方法嗎?
一些歷史
你問:我只是想知道IndexReader.terms()
是否已經移動或被替代品取代。
Lucene v3 方法IndexReader.terms()
在 Lucene v4 中移至AtomicReader
。 這在v4 alpha 發行說明中有記錄。
(請記住,Lucene v4 早在 2012 年就發布了。)
v4 中AtomicReader
中的方法采用字段 name 。
正如 v4 發行說明所述:
一個很大的區別是現在單獨枚舉字段和術語:TermsEnum 為單個字段中的每個術語提供一個 BytesRef(包裝一個 byte[]),而不是一個術語。
關鍵部分是“單個字段中的每個術語” 。 因此,從那時起,不再需要通過單個 API 調用來檢索索引中的所有術語。
這種方法一直LeafReader
到以后的版本——除了AtomicReader
和AtomicReaderContext
類在 Lucene v 5.0.0 中被重命名為LeafReader
和LeafReaderContext
。 請參閱Lucene-5569 。
最近發布
這使我們能夠訪問術語列表 - 但僅限於每個字段:
以下代碼基於最新版本的 Lucene (8.7.0),但也適用於您提到的版本 (8.6.1) - 使用 Java 的示例:
private void getTokensForField(IndexReader reader, String fieldName) throws IOException {
List<LeafReaderContext> list = reader.leaves();
for (LeafReaderContext lrc : list) {
Terms terms = lrc.reader().terms(fieldName);
if (terms != null) {
TermsEnum termsEnum = terms.iterator();
BytesRef term;
while ((term = termsEnum.next()) != null) {
System.out.println(term.utf8ToString());
}
}
}
}
上面的例子假設一個索引如下:
private static final String INDEX_PATH = "/path/to/index/directory";
...
IndexReader reader = DirectoryReader.open(FSDirectory.open(Paths.get(INDEX_PATH)));
如果您需要枚舉字段名稱, 此問題中的代碼可能會提供一個起點。
最后說明
我想您也可以按文檔訪問術語,而不是按字段訪問,如評論中所述。 我沒有試過這個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.