Расхождение Lucene fieldNorm между вычислением сходства и значением времени запроса
Я пытаюсь понять какfieldNorm
вычисляется (во время индекса), а затем используется (и явно пересчитывается) во время запроса.
Во всех примерах я использую StandardAnalyzer без стоп-слов.
ВылечитьDefaultSimilarity
«scomputeNorm
Метод при индексации вещи, я заметил, что для 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.
Насколько велика потеря точности? Существует ли минимальный разрыв между различными значениями, чтобы они оставались разными даже после пересчета потерь точности?