2010-08-26 5 views

ответ

4

Lucene построена так, чтобы отвечать на противоположный вопрос, то есть какие документы содержат данный термин. Поэтому, чтобы получить количество терминов для документа, вам нужно немного взломать.

Первый метод заключается в сохранении вектора условий для каждого поля, которое необходимо для получения количества терминов. Вектор слагаемых - это список терминов полей. Во время поиска вы можете получить его с помощью метода IndexReader getTermFreqVector (если они были сохранены во время индекса). Когда у вас есть это, вы получите длину вектора, и у вас есть количество терминов для этого поля.

Другой метод, если вы сохранили поля ваших документов, состоит в том, чтобы вернуть текст этих полей и подсчитать количество терминов, проанализировав его (разделить текст на слова).

Последнее, если для вас достаточно аппроксимации количества членов поля, и вы сохранили нормы в индексном времени, есть возможность вычислить обратную функцию той, которая используется для вычисления норм поля , Если вы внимательно посмотрите на метод lengthNorm класса сходства, вы заметите, что он использует количество терминов поля. Результат этого метода хранится в индексе с использованием метода encodeNorm. Вы можете в течение времени поиска восстановить нормы, используя метод IndexReader norms. С нормой в руке использует обратную математическую функцию той, которая используется в lengthNorm, чтобы вернуть число членов. Как я уже сказал, это всего лишь приближение, потому что, когда норма сохраняется, некоторая точность теряется, и вы не можете получить точно такое же число, как и то, что было сохранено.

4

Это на самом деле довольно сложно сделать в Lucene, если вы не храните векторы сроков в индексное время. Основная структура данных Lucene - это инвертированный индекс, который хранит термины как ключи и списки идентификаторов документов в качестве значений. Вот почему в API нет метода getNumTerms(), потому что фундаментальные структуры данных, которые использует Lucene, не поддерживают его.

При этом вы можете хранить векторы сроков в индексе, который вы можете найти по идентификатору документа во время поиска. Эти векторы являются по существу полным списком всех терминов в этом документе, которые вы можете подсчитать, чтобы получить свои # терминов.

См

http://lucene.apache.org/java/3_0_1/api/all/org/apache/lucene/document/Field.TermVector.html

В качестве альтернативы, вы можете рассчитывать все условия заранее и хранить его в качестве поля в индексе.

+0

+1 сохранение количества терминов в индексном времени - хорошая идея –

Смежные вопросы