Как получить позиции из вектора термина документа в 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;

Ответы на вопрос(2)

Ваш ответ на вопрос