Как получить позиции из вектора термина документа в 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» для всех позиции.
Во-первых, я делаю что-то не так? Есть ли альтернативный способ перебора сообщений на основе документа? Второе: что происходит в любом случае? Индекс содержит позиции, экземпляр Terms, возвращаемый getTermVector, утверждает, что он включает позиции, и я смотрю на правильные значения позиций в 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;