2016-03-05 175 views
3

我需要遍历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; 
+0

原来,错误是由与缓存和重用PostingsEnum一些无关的错误造成的,所以[jpountz(http://stackoverflow.com/a/35826801/1386105)的答案是正确的,我做错了。在这种情况下应该做什么?删除问题? – gorgonzola

回答

0

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

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

谢谢你的回答,但事实证明我正在犯一个无关的错误。看到我上面的评论。 – gorgonzola