gpt4 book ai didi

java - 如何从 Lucene 8.6.1 索引中获取所有 token 的列表?

转载 作者:行者123 更新时间:2023-12-04 08:33:23 24 4
gpt4 key购买 nike

我看过how to get a list of all tokens from Solr/Lucene index?但 Lucene 8.6.1 似乎不提供 IndexReader.terms() .它被移动或更换了吗?有没有比 this answer 更简单的方法?

最佳答案

一些历史
你问:我只是想知道是否IndexReader.terms()已移动或被替代品取代。
Lucene v3 方法 IndexReader.terms() 已移至 AtomicReader 在 Lucene v4 中。这记录在 v4 alpha release notes 中.
(请记住,Lucene v4 早在 2012 年就发布了。)AtomicReader中的方法在 v4 中需要一个 field name .
正如 v4 发行说明所述:

One big difference is that field and terms are now enumerated separately: a TermsEnum provides a BytesRef (wraps a byte[]) per term within a single field, not a Term.


关键部分是“单个字段中的每个术语”。因此,从那时起,不再需要通过单个 API 调用来检索索引中的所有术语。
这种方法一直延续到以后的版本 - 除了 AtomicReaderAtomicReaderContext类被重命名为 LeafReaderLeafReaderContext在 Lucene v 5.0.0 中。见 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)));
如果需要枚举字段名,代码在 this question可以提供一个起点。
最后说明
我想您也可以按文档访问术语,而不是按字段访问,如评论中所述。我没有试过这个。

关于java - 如何从 Lucene 8.6.1 索引中获取所有 token 的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64921086/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com