Пример в этом вопросе и некоторые другие, которые я видел в Интернете, используют postings
метод TermVector
для получения позиций терминов.Скопируйте вставку из примера в связанном вопросе:
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.
}
}
}
Этот код работает для меня, но меня бесит то, что тип Terms
хранит информацию о местоположении.Во всей документации, которую я видел, говорится, что векторы терминов хранят данные о местоположении.Тем не менее, нет методов этого типа, чтобы получить эту информацию!
В старых версиях Lucene, по-видимому, был метод, но, по крайней мере, в версии 6.5.1 Lucene это не так.
Вместо этого я должен использовать метод postings
и просматривать документы, но я уже знаю, над каким документом я хочу работать!
В документации API ничего не говорится о сообщениях, возвращаемых толькотекущий документ (тот, к которому относится термин vector), но когда я его запускаю, я получаю только текущий документ.
Это правильный и единственный способ получить данные о положении из векторов терминов?Почему такой не интуитивный API?Есть ли документ, который объясняет, почему предыдущий подход изменился в пользу этого?