我需要遍历Lucene索引中的所有文档,并获取每个文档中每个词的位置。至于我能够从Lucene的的javadoc了解,要做到这一点的办法是做这样的事情:如何从Lucene的文档术语矢量中获取位置?
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返回的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;
原来,错误是由与缓存和重用PostingsEnum一些无关的错误造成的,所以[jpountz(http://stackoverflow.com/a/35826801/1386105)的答案是正确的,我做错了。在这种情况下应该做什么?删除问题? – gorgonzola