Pregunta

Quiero mis resultados de búsqueda a fin por puntuación, lo que están haciendo, pero la puntuación se calcula de manera incorrecta. Es decir, no necesariamente inadecuadamente , pero de manera diferente de lo esperado y no estoy seguro de por qué. Mi objetivo es eliminar todo lo que está cambiando el resultado.

Si realizo una búsqueda que los partidos en dos objetos (donde se espera Objecta tener una puntuación más alta que ObjectB), ObjectB se está volviendo en primer lugar.

Vamos a decir, para este ejemplo, que mi consulta es un solo término:. "Manzanas"

  

El título de Objecta: "las manzanas son manzanas" (2/3 términos)
  Descripción de Objecta: "Había manzanas en las manzanas con las manzanas y las manzanas ahora todas las manzanas fue todo sobre las manzanas!" (6/18 términos)
  El título de ObjectB: "las manzanas son grandes" (1/3 términos)
  Descripción de ObjectB: "Había Manzanas en la habitación y ahora las manzanas fue del todo malo por todas las manzanas!" (4/18 términos)

El campo de título no tiene impulso (o más bien, un impulso de 1) y el campo de descripción tiene un impulso de 0,8. No he especificado un impulso documento a través solrconfig.xml oa través de la consulta que estoy de paso. Si hay otra forma de especificar un impulso documento, existe la posibilidad de que me falta uno.

Después de analizar la impresión explain, parece que Objecta es calcular adecuadamente una puntuación más alta que ObjectB, al igual que yo quiero, a excepción de un diferencia: fieldNorm título de ObjectB es siempre mayor que Objecta de.


A continuación sigue la copia impresa explain. Para que lo sepas: el campo de título es mditem5_tns y el campo de descripción es mditem7_tns:

ObjectB:
1.3327172 = (MATCH) sum of:
  1.0352166 = (MATCH) max plus 0.1 times others of:
    0.9766194 = (MATCH) weight(mditem5_tns:appl in 0), product of:
      0.53929156 = queryWeight(mditem5_tns:appl), product of:
        1.8109303 = idf(docFreq=3, maxDocs=9)
        0.2977981 = queryNorm
      1.8109303 = (MATCH) fieldWeight(mditem5_tns:appl in 0), product of:
        1.0 = tf(termFreq(mditem5_tns:appl)=1)
        1.8109303 = idf(docFreq=3, maxDocs=9)
        1.0 = fieldNorm(field=mditem5_tns, doc=0)
    0.58597165 = (MATCH) weight(mditem7_tns:appl^0.8 in 0), product of:
      0.43143326 = queryWeight(mditem7_tns:appl^0.8), product of:
        0.8 = boost
        1.8109303 = idf(docFreq=3, maxDocs=9)
        0.2977981 = queryNorm
      1.3581977 = (MATCH) fieldWeight(mditem7_tns:appl in 0), product of:
        2.0 = tf(termFreq(mditem7_tns:appl)=4)
        1.8109303 = idf(docFreq=3, maxDocs=9)
        0.375 = fieldNorm(field=mditem7_tns, doc=0)
  0.2975006 = (MATCH) FunctionQuery(1000.0/(1.0*float(top(rord(lastmodified)))+1000.0)), product of:
    0.999001 = 1000.0/(1.0*float(1)+1000.0)
    1.0 = boost
    0.2977981 = queryNorm

ObjectA:
1.2324848 = (MATCH) sum of:
  0.93498427 = (MATCH) max plus 0.1 times others of:
    0.8632177 = (MATCH) weight(mditem5_tns:appl in 0), product of:
      0.53929156 = queryWeight(mditem5_tns:appl), product of:
        1.8109303 = idf(docFreq=3, maxDocs=9)
        0.2977981 = queryNorm
      1.6006513 = (MATCH) fieldWeight(mditem5_tns:appl in 0), product of:
        1.4142135 = tf(termFreq(mditem5_tns:appl)=2)
        1.8109303 = idf(docFreq=3, maxDocs=9)
        0.625 = fieldNorm(field=mditem5_tns, doc=0)
    0.7176658 = (MATCH) weight(mditem7_tns:appl^0.8 in 0), product of:
      0.43143326 = queryWeight(mditem7_tns:appl^0.8), product of:
        0.8 = boost
        1.8109303 = idf(docFreq=3, maxDocs=9)
        0.2977981 = queryNorm
      1.6634457 = (MATCH) fieldWeight(mditem7_tns:appl in 0), product of:
        2.4494898 = tf(termFreq(mditem7_tns:appl)=6)
        1.8109303 = idf(docFreq=3, maxDocs=9)
        0.375 = fieldNorm(field=mditem7_tns, doc=0)
  0.2975006 = (MATCH) FunctionQuery(1000.0/(1.0*float(top(rord(lastmodified)))+1000.0)), product of:
    0.999001 = 1000.0/(1.0*float(1)+1000.0)
    1.0 = boost
    0.2977981 = queryNorm
¿Fue útil?

Solución

El problema es causado por la despalilladora. Se expande "las manzanas son manzanas" a "las manzanas son manzanas apl apl" con lo que el campo más largo. Como documento B sólo contiene 1 término que se está ampliando por la despalilladora las estancias de campo más corto que el documento A.

Este resultado en diferentes fieldNorms.

Otros consejos

FieldNOrm se calcula de 3 componentes - impulso en tiempo índice en el campo, impulso índice de tiempo en el documento y longitud de campo. Suponiendo que no se está suministrando cualquier impulso de tiempo de índice, la diferencia debe ser la longitud del campo.

Así, desde lengthNorm es mayor para los valores de los campos más cortos, para B a tener un valor más alto fieldNorm por el título, debe tener menor número de fichas en el título de A.

Ver las páginas siguientes para una explicación detallada de Lucene de puntuación:

http://lucene.apache.org/java/2_4_0/scoring.html http://lucene.apache.org/ java / 2_4_0 / api / org / apache / Lucene / search / Similarity.html

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top