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

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

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

ВылечитьDefaultSimilarity«scomputeNorm Метод при индексации вещи, я заметил, что для 2 конкретных документов он возвращает:

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

Это уже странно (для меня, я уверен, что я что-то упустил). Почему я не получаю те же значения для нормы поля, которые рассчитываются во время индекса? Это «нормализация запроса» в действии? Если так, как это работает?

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

Затем я создал собственный класс Similarity, в котором реализовал метод 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, сообщаемый методом computeNorm в сходстве, не остается таким же, как сообщаемый запросом, объясняет?почему для двух разных значений fieldNorm, полученных во время индекса (с помощью подобия computeNorm), я получаю идентичные значения fieldNorm во время запроса?

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

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

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

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

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

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