我正在将Lucene用于Eclipse插件。目前,我对这样的索引词进行迭代:


我使用IndexReader.getTermVector(id,field)获得一个条款实例
我使用TermsEnum遍历此实例,如下所示:while ((text = vectorEnum.next()) != null)


现在,我还需要获取字段的前n个元素。我认为必须使用PostingsEnum来完成此操作,但是我不知道如何使用它。我想我可以通过在我的TermsEnum上调用postsing()来获得它,但是我不知道该怎么做。

编辑:
我猜那是我代码的重要部分:

Terms vector = indexReader.getTermVector(id, field);
BytesRef text = null;
if (vector != null) {
                TermsEnum vectorEnum = vector.iterator();
                while ((text = vectorEnum.next()) != null) {
                    String term = text.utf8ToString();
                    [do stuff]
                }


这就是FieldType:

FieldType fieldType = new FieldType();
fieldType.setIndexOptions(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS);
fieldType.setStored(true);
fieldType.setStoreTermVectors(true);
fieldType.setTokenized(true);

最佳答案

不知道为什么,但是使用setIndexOptions请求职位似乎不起作用,因此您必须显式设置setStoreTermVectorPositions。您仍然必须将索引选项设置为NONE以外的其他选项,但是似乎并不需要使用DOCS_AND_FREQS_AND_POSITIONS,即

fieldType.setIndexOptions(IndexOptions.DOCS);
fieldType.setStoreTermVectorPositions(true);


然后您可以访问以下职位:

Terms vector = indexReader.getTermVector(id, field);
if (vector != null) {
    TermsEnum vectorEnum = vector.iterator();
    BytesRef text;
    while ((text = vectorEnum.next()) != null) {
        String term = text.utf8ToString();
        PostingsEnum postings = vectorEnum.postings(null, PostingsEnum.POSITIONS);
        while (postings.nextDoc() != DocIdSetIterator.NO_MORE_DOCS) {
            int freq = postings.freq();
            while (freq-- > 0)
                logger.info("Position: {}", postings.nextPosition());
        }
    }
}

07-24 09:47