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