2016-03-05 180 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