如何从Lucene的文档术语向量中获取位置?

时间:2016-03-05 01:50:18

标签: java lucene

我需要遍历Lucene索引中的所有文档,并获取每个文档中每个术语出现的位置。据我所知,从Lucene javadoc可以理解,做到这一点的方法是做这样的事情:

IndexReader ir = obtainIndexReader();
Terms tv = ir.getTermVector( doc, field );
TermsEnum terms = tv.iterator();
PostingsEnum p = null;
while( terms.next() != null ) {
    p = terms.postings( p, PostingsEnum.ALL );
    while( p.nextDoc() != PostingsEnum.NO_MORE_DOCS ) {
        int freq = p.freq();
        for( int i = 0; i < freq; i++ ) {
            int pos = p.nextPosition();   // Always returns -1!!!
            BytesRef data = p.getPayload();
            doStuff( freq, pos, data ); // Fails miserably, of course.
        }
    }
}

然而,即使(1)指数确实包括相关领域的位置和(2)术语向量声称有位置(即:tv.hasPositions()== true),我仍然得到&#34 -1&#34;对于所有职位。

首先,我做错了什么?是否有基于每个文档迭代过帐的替代方法?第二:到底发生了什么事?索引包含位置,getTermVector返回的Terms实例声称包含位置,我在Luke中查看正确的位置值,但当我尝试在我的代码中访问所述值时,我仍然得到-1。是什么给了什么?

编辑:相关字段配置了以下选项:

    FieldType ft = new FieldType();
    ft.setIndexOptions( IndexOptions.DOCS_AND_FREQS_AND_POSITIONS_AND_OFFSETS );
    ft.setStoreTermVectors( true );
    ft.setStoreTermVectorOffsets( true );
    ft.setStoreTermVectorPayloads( true );
    ft.setStoreTermVectorPositions( true );
    ft.setTokenized( true );
    return ft;

2 个答案:

答案 0 :(得分:1)

您是否在索引时对字段类型设置了FieldType.setStoreTermVectorPositions(true)? http://lucene.apache.org/core/5_5_0/core/org/apache/lucene/document/FieldType.html#setStoreTermVectorPositions(boolean)

答案 1 :(得分:0)

我尝试时你的代码运行正常 您是否正确地将FieldType添加到文档中? 我这样做了:

Field ff = new Field("name", "value", ft);
document.add(ff);