Подтвердить что ты не робот

Как получить все условия для поля Lucene в Lucene 4

Я пытаюсь обновить свой код от Lucene 3.4 до 4.1. Я понял изменения, кроме одного. У меня есть код, который должен перебирать все значения термина для одного поля. В Lucene 3.1 существует метод IndexReader # terms(), предоставляющий TermEnum, который я мог бы перебирать. Это, похоже, изменилось для Lucene 4.1 и даже после нескольких часов поиска в документации я не могу понять, как это сделать. Может ли кто-нибудь указать мне в правильном направлении?

Спасибо.

4b9b3361

Ответ 1

Пожалуйста, следуйте Руководство по переносу Lucene 4:

Как вы получили перечисления, изменилось. Основной точкой входа является Fields класс. Если вы знаете, что ваш читатель является читателем на одном сегменте, это:

Fields fields = reader.Fields();
if (fields != null) {
  ...
}

Если читатель может быть многосегментным, вы должны сделать это:

Fields fields = MultiFields.getFields(reader);
if (fields != null) {
  ...
}

Fields может быть null (например, если у читателя нет полей).

Обратите внимание, что подход MultiFields влечет за собой MultiReaders, так как он должен объединять термины/документы/позиции "на лету". Это как правило, лучше получать последовательные читатели (используйте oal.util.ReaderUtil), а затем пройдите через самих читателей, если вы можете (так Lucene ищет поиск).

Если вы передадите SegmentReader в MultiFields.fields, он просто return reader.fields(), поэтому в этом случае нет производительности.

Как только у вас есть ненулевые поля, вы можете сделать это:

Terms terms = fields.terms("field");
if (terms != null) {
  ...
}

terms может быть null (например, если поле не существует).

Как только у вас есть условия не null, вы можете получить перечисление следующим образом:

TermsEnum termsEnum = terms.iterator();

Возвращенный TermsEnum не будет равен нулю.

Вы можете .next() через TermsEnum