¿Cómo obtener posiciones de un vector de término de documento en Lucene?

Necesito iterar sobre todos los documentos en un índice de Lucene y obtener las posiciones en las que se produce cada término en cada documento. Por lo que puedo entender del Luvado javadoc, la forma de hacer esto es hacer algo como esto:

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

Sin embargo, aunque (1) el índice sí incluye posiciones en el campo relevante y (2) el término vector afirma tener posiciones (es decir: tv.hasPositions () == verdadero), sigo obteniendo "-1" para todos puestos.

Primero, ¿estoy haciendo algo mal? ¿Existe una forma alternativa de iterar sobre las publicaciones por documento? Segundo: ¿Qué está pasando de todos modos? El índice contiene posiciones, la instancia de Términos devuelta por getTermVector afirma incluir posiciones, y estoy mirando los valores de posición correctos en Luke, pero aún obtengo -1 cuando intento acceder a dichos valores en mi código. ¿Lo que da?

EDITAR: El campo relevante se configuró con las siguientes opciones:

    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;

Respuestas a la pregunta(2)

Su respuesta a la pregunta