Lucene fieldNorm discrepancia entre el cálculo de similitud y el valor de tiempo de consulta

Estoy tratando de entender comofieldNorm se calcula (en el momento del índice) y luego se utiliza (y se recalcula aparentemente) en el momento de la consulta.

En todos los ejemplos, estoy usando el analizador estándar sin palabras de detención.

Deugging elDefaultSimilarityescomputeNorm Método mientras indexaba cosas, he notado que para 2 documentos en particular devuelve:

0.5 para el documento A (que tiene 4 fichas en su campo)0.70710677 para el documento B (que tiene 2 fichas en su campo)

Lo hace mediante el uso de la fórmula:

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

donde impulso es siempre 1

Luego, cuando pregunto por estos documentos, veo que en la consulta se explica lo que obtengo

0.5 = fieldNorm(field=titre, doc=0) para el documento A0.625 = fieldNorm(field=titre, doc=1) para el documento B

Esto ya es extraño (para mí, estoy seguro de que soy yo a quien le falta algo). ¿Por qué no obtengo los mismos valores para la norma de campo que los calculados en el momento del índice? ¿Es esta la cosa "normalización de consulta" en acción? Si es así, ¿cómo funciona?

Sin embargo, esto es más o menos correcto ya que los dos campos de tiempo de consulta ordenan el mismo orden que los calculados en el momento del índice (el campo con el valor más corto tiene el campo más alto en ambos casos)

Luego hice mi propia clase de similitud en la que implementé el método computeNorms así:

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

En el momento del índice ahora obtengo:

1.5 para el documento A (que tiene 4 fichas en su campo)1.7071068 para el documento B (que tiene 2 fichas en su campo)

Sin embargo, ahora, cuando pregunto por estos documentos, puedo ver que ambos tienen la misma norma de campo que la función de explicación:

1.5 = fieldNorm(field=titre, doc=0) para el documento A1.5 = fieldNorm(field=titre, doc=1) para el documento B

Para mí, esto ahora es realmente extraño, ¿cómo es que si utilizo una similitud aparentemente buena para calcular el valor de FieldNorm en el momento del índice, que me da valores adecuados proporcionales al número de tokens, más adelante, en el momento de la consulta, todo esto se pierde y ¿La consulta dice que ambos documentos tienen la misma norma de campo?

Así que mis preguntas son:

¿por qué el índice de tiempo fieldNorm según lo informado por el método computeNorm de Similarity no sigue siendo el mismo que el reportado por explicación?¿Por qué, para dos valores diferentes de fieldNorm obtenidos en el momento del índice (a través de computeNorm de similitud) obtengo valores idénticos de fieldNorm en el momento de la consulta?

== ACTUALIZACIÓN

Ok he encontrado algo enDocs de lucene lo que aclara algunas de mis preguntas, pero no todas:

Sin embargo, el valor de la norma resultante se codifica como un byte único antes de ser almacenado. En el momento de la búsqueda, el valor del byte de la norma se lee desde el directorio del índice y se descodifica a un valor de la norma flotante. Esta codificación / decodificación, a la vez que reduce el tamaño del índice, viene con el precio de la pérdida de precisión; no se garantiza que la decodificación (codificación (x)) = x. Por ejemplo, decodificar (codificar (0.89)) = 0.75.

¿Cuánta pérdida de precisión hay? ¿Hay un espacio mínimo que debamos colocar entre diferentes valores para que permanezcan diferentes incluso después de los nuevos cálculos de pérdida de precisión?

Respuestas a la pregunta(1)

Su respuesta a la pregunta