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;