Java 如何从Lucene 8.6.1索引中获取所有令牌的列表?

Java 如何从Lucene 8.6.1索引中获取所有令牌的列表?,java,python,search,lucene,pylucene,Java,Python,Search,Lucene,Pylucene,我已经看过了,但是Lucene 8.6.1似乎没有提供IndexReader.terms()。它被移动或替换了吗?有没有比历史更简单的方法 您问:我只是想知道IndexReader.terms()是否已经移动或被替代 Lucene v3方法在Lucene v4中移动到。这一点已记录在报告中 (请记住,Lucene v4早在2012年就发布了。) v4中的AtomicReader中的方法采用了 正如v4发行说明所述: 一个很大的区别是字段和术语现在分别枚举:TermsEnum在单个字段中为每个术语

我已经看过了,但是Lucene 8.6.1似乎没有提供
IndexReader.terms()
。它被移动或替换了吗?有没有比历史更简单的方法

您问:我只是想知道
IndexReader.terms()
是否已经移动或被替代

Lucene v3方法在Lucene v4中移动到。这一点已记录在报告中

(请记住,Lucene v4早在2012年就发布了。)

v4中的
AtomicReader
中的方法采用了

正如v4发行说明所述:

一个很大的区别是字段和术语现在分别枚举:TermsEnum在单个字段中为每个术语提供一个BytesRef(包装一个字节[]),而不是一个术语

关键部分是“单个字段中的每个术语”。因此,从那时起,不再有一个API调用来检索索引中的所有术语

这种方法一直沿用到后来的版本中,除了Lucene v 5.0.0中的
AtomicReader
AtomicReaderContext
类被重命名为
LeafReader
LeafReaderContext
。看

最新版本

这使我们能够访问术语列表,但仅限于每个字段:

下面的代码基于Lucene的最新版本(8.7.0),但对于您提到的版本(8.6.1),也应该是正确的-使用Java的示例:

private void getTokensForField(IndexReader reader,String fieldName)引发IOException{
List=reader.leaves();
对于(LeafReaderContext lrc:list){
Terms Terms=lrc.reader().Terms(字段名);
如果(术语!=null){
TermsEnum TermsEnum=terms.iterator();
BytesRef术语;
while((term=termsEnum.next())!=null){
System.out.println(term.utf8ToString());
}
}
}
}
上述示例假设索引如下所示:

private静态最终字符串INDEX_PATH=“/PATH/to/INDEX/directory”;
...
IndexReader=DirectoryReader.open(FSDirectory.open(PATH.get(INDEX_PATH));
如果需要枚举字段名,中的代码可能会提供一个起点

最后一个音符


我想您也可以访问每个文档的术语,而不是评论中提到的每个字段的术语。我还没有尝试过这一点。

这里有一个答案,其中包含一些提取字段和术语的代码。基本上,迭代所有文档,并为每个mthanks@NikolaiDmitriev获取值。我想这是一种方法,但我只是想知道
IndexReader.terms()
是否已经移动或被替代。对不起,在接受答案之前,我没有测试过这一点。我在Python中尝试了这一点,得到了如下错误:
AttributeError:'TermsEnum'对象没有属性'next'
。我认为这与“当您第一次获取TermsEnum时它是未定位的,您必须首先成功地调用BytesRefierator.next()或其中一个seek方法”有关。但我不理解这一点。你能帮忙吗?对不起,我没有使用Lucene的Python包装器。
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu?或者您可以使用
next(x)
(请参阅)。否则,我认为您可能需要专门针对这一点提出一个新的Python问题。
next()
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。我发布了一个新问题。