Как посчитать количество терминов для каждого документа в lucene index? - PullRequest
2 голосов
/ 26 августа 2010

Я хочу знать количество терминов для каждого документа в люценовом индексе.Я искал в API и в Интернете безрезультатно.Вы можете мне помочь?

Ответы [ 2 ]

4 голосов
/ 26 августа 2010

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

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

См

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

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

4 голосов
/ 26 августа 2010

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...