【问题标题】:How to get positions from a document term vector in Lucene?如何从 Lucene 中的文档术语向量中获取位置?
【发布时间】:2016-06-18 22:54:46
【问题描述】:

我需要遍历 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),我仍然得到“-1 " 适用于所有职位。

首先,我是不是做错了什么?是否有另一种方法可以在每个文档的基础上迭代过帐?第二:到底发生了什么?该索引包含位置,getTermVector 返回的术语实例声称包含位置,我正在查看 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;

【问题讨论】:

  • 原来这个错误是由于缓存和重用PostingsEnum的一些不相关的错误引起的,所以jpountz的答案是正确的,我做错了。在这种情况下应该怎么做?删除问题?

标签: java lucene


【解决方案1】:

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

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

【讨论】:

  • 感谢您的回答,但事实证明我犯了一个不相关的错误。请参阅我上面的评论。
【解决方案2】:

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

【讨论】:

  • 确实,我将FieldType配置添加到问题中。
猜你喜欢
  • 2012-02-14
  • 1970-01-01
  • 2012-02-05
  • 1970-01-01
  • 2018-11-17
  • 2018-04-29
  • 1970-01-01
  • 2013-02-20
  • 2010-11-16
相关资源
最近更新 更多