IndexReader reader = IndexReader.open(index);
TermEnum terms = reader.terms();
Set<String> uniqueTerms = new HashSet<String>();
while (terms.next()) {
final Term term = terms.term();
if (term.field().equals("field_name")) {
uniqueTerms.add(term.text());
}
}
// IndexReader has leaves, you'll iterate through those
int leavesCount = reader.leaves().size();
final String fieldName = "content";
for(int l = 0; l < leavesCount; l++) {
System.out.println("l: " + l);
// specify the field here ----------------------------->
TermsEnum terms = reader.leaves().get(l).reader().terms(fieldName).iterator();
// this stops at 20 just to sample the head
for(int i = 0; i < 20; i++) {
// and to get it out, here -->
final Term content = new Term(fieldName, BytesRef.deepCopyOf(terms.next()));
System.out.println("i: " + i + ", term: " + content);
}
}
6条答案
按热度按时间cgyqldqp1#
如果你使用的是Lucene 4.0 api,你需要从索引读取器中获取字段。然后,Fields提供了获取索引中每个字段的术语的方法。下面是一个如何做到这一点的示例:
最后,对于新版本的Lucene,您可以从BytesRef调用中获取字符串:
而不是
如果你想得到单据频率,你可以做:
neskvpey2#
您要查找术语向量(字段中所有单词的集合以及每个单词的使用次数,不包括停用词),您将对索引中的每个文档使用IndexReader的getTermFreqVector(docid,field),并使用它们填充
HashSet
。另一种方法是使用terms(),只为您感兴趣的字段选择术语:
这不是最优的解决方案,你在阅读然后丢弃所有其他字段。Lucene 4中有一个类
Fields
,它只返回单个字段的terms(field)。xj3cbfub3#
同样的结果,只是更简洁一点,就是使用
lucene-suggest
包中的LuceneDictionary
。它通过返回BytesRefIterator.EMPTY
来处理不包含任何项的字段。这将为您节省一个NPE:)osh3o9ms4#
从Lucene 7+开始,以上链接和一些相关链接已过时。
以下是最新版本:
c9x0cxw05#
使用
TermsEnum
和terms.next()
的答案有一个细微的错误,这是因为TermsEnum
已经指向了第一个术语,所以while(terms.next())
将导致第一个术语被跳过。请改用for循环:
要修改已接受答案中的代码:
dvtswwa36#
与@pokeRex110的解决方案相比略有不同(使用Lucene 9.3.0进行测试)