【发布时间】: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的答案是正确的,我做错了。在这种情况下应该怎么做?删除问题?