簡體   English   中英

如何從 Lucene 8.6.1 索引中獲取所有令牌的列表?

[英]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到以后的版本——除了AtomicReaderAtomicReaderContext類在 Lucene v 5.0.0 中被重命名為LeafReaderLeafReaderContext 請參閱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.

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