Расхождение Lucene fieldNorm между вычислением сходства и значением времени запроса

я пытаюсь понять, какfieldNorm вычисляется (во время индекса), а затем используется (и явно пересчитывается) во время запроса.

Во всех примерах яЯ использую StandardAnalyzer без стоп-слов.

ДойджингDefaultSimilaritycomputeNorm метод при индексации вещей, яМы заметили, что для двух конкретных документов он возвращает:

0,5 для документа A (в котором имеется 4 токена на поле)0,70710677 для документа B (в его поле есть 2 токена)

Это делается с помощью формулы:

state.getBoost() * ((float) (1.0 / Math.sqrt(numTerms)));

где повышение всегда 1

Впоследствии, когда я запрашиваю эти документы, я вижу, что в запросе объяснения я получаю

0.5 = fieldNorm(field=titre, doc=0) для документа А0.625 = fieldNorm(field=titre, doc=1) для документа B

Это уже странно (для меняя уверен, что этокто я?что-то упустил). Почему Дон't Я получаю те же значения для нормы поля, что и рассчитанные во время индекса? Это "нормализация запросов " вещь в действии? Если так, как это работает?

Это, однако, более или менее нормально, так как два поляNorm времени запроса дают тот же порядок, что и рассчитанные в индексное время (поле с более коротким значением имеет более высокое поле FieldNorm в обоих случаях) I '

Затем я сделал свой собственный класс сходства, где ямы реализовали метод computeNorms так:

public float computeNorm(String pField, FieldInvertState state) {
    norm = (float) (state.getBoost() + (1.0d / Math.sqrt(state.getLength())));
    return norm;
}

Во время индекса я теперь получаю:

1.5 для документа A (который имеет 4 токена в своем поле)1.7071068 для документа B (в его поле есть 2 токена)

Однако теперь, когда я запрашиваю эти документы, я вижу, что они оба имеют одинаковую норму поля, как сообщается функцией объяснения:

1.5 = fieldNorm(field=titre, doc=0) для документа А1.5 = fieldNorm(field=titre, doc=1) для документа B

Для меня это теперь действительно странно, почему, если я использую явно хорошее сходство для вычисления fieldNorm во время индекса, которое дает мне правильные значения, пропорциональные количеству токенов, позже, во время запроса, все это теряется и запрос говорит, что оба документа имеют одинаковую норму поля?

Итак, мои вопросы:

почему индекс времени fieldNorm как сообщается по сходству 's метод computeNorm не остается таким же, как тот, который указан в запросе объяснения?почему для двух разных значений fieldNorm, полученных во время индекса (с помощью подобия computeNorm), я получаю идентичные значения fieldNorm во время запроса?

== ОБНОВЛЕНИЕ

Хорошо ямы нашли что-то вLucene»документы который проясняет некоторые мои вопросы, но не все:

Однако приведенное значение нормы перед сохранением кодируется одним байтом. Во время поиска значение байта нормы считывается из каталога индекса и декодируется обратно в значение нормы с плавающей точкой. Такое кодирование / декодирование, хотя и уменьшает размер индекса, сопровождается ценой потери точности - не гарантируется, что decode (encode (x)) = x. Например, декодировать (кодировать (0,89)) = 0,75.

Насколько велика потеря точности? Существует ли минимальный разрыв между различными значениями, чтобы они оставались разными даже после пересчета потерь точности?

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

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