Como obter posições de um vetor de termo de documento no Lucene?

Preciso iterar todos os documentos em um índice Lucene e obter as posições em que cada termo ocorre em cada documento. Tanto quanto eu posso entender pelo javadoc do Lucene, a maneira de fazer isso é fazer algo assim:

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

No entanto, mesmo que (1) o índice realmente inclua posições no campo relevante e (2) o termo vetor alega ter posições (por exemplo: tv.hasPositions () == true), continuo recebendo "-1" para todos posições.

Primeiro, estou fazendo algo errado? Existe uma maneira alternativa de iterar sobre lançamentos por documento? Segundo: O que está acontecendo, afinal? O índice contém posições, a instância de Termos retornada por getTermVector afirma incluir posições, e eu estou olhando os valores de posição corretos em Luke, mas ainda recebo -1 quando tento acessar esses valores no meu código. O que da?

EDIT: O campo relevante foi configurado com as seguintes opções:

    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;