我需要遍歷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