Wie erhalte ich Positionen aus einem Dokumenttermvektor in Lucene?

Ich muss alle Dokumente in einem Lucene-Index durchlaufen und die Positionen ermitteln, an denen jeder Begriff in jedem Dokument vorkommt. Soweit ich das aus dem Lucene-Javadoc verstehen kann, ist der Weg, dies zu tun, so etwas wie dies zu tun:

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.
        }
    }
}

Obwohl (1) der Index tatsächlich Positionen im relevanten Feld enthält und (2) der Begriff "Vektor" angibt, Positionen zu haben (dh: tv.hasPositions () == true), erhalte ich immer "-1" für alle Positionen.

Zunächst mache ich etwas falsch? Gibt es eine alternative Möglichkeit, Buchungen pro Dokument zu durchlaufen? Zweitens: Was ist eigentlich los? Der Index enthält Positionen, die von getTermVector zurückgegebene Terms-Instanz enthält angeblich Positionen, und ich überprüfe die korrekten Positionswerte in Luke, erhalte jedoch immer noch -1, wenn ich versuche, auf diese Werte in meinem Code zuzugreifen. Was gibt

EDIT: Das entsprechende Feld wurde mit folgenden Optionen konfiguriert:

    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;

Antworten auf die Frage(4)

Ihre Antwort auf die Frage