Puede simplemente ejecutar su consulta q=field_name:David
con debugQuery=on
y ver qué pasa.
Estos son los resultados (incluida la puntuación a través fl=*,score
) ordenados según score desc
:
<doc>
<float name="score">0.4451987</float>
<str name="id">2</str>
<arr name="text_ws">
<str>David Letterman</str>
</arr>
</doc>
<doc>
<float name="score">0.44072422</float>
<str name="id">3</str>
<arr name="text_ws">
<str>David Hasselhoff</str>
<str>David Michael Hasselhoff</str>
</arr>
</doc>
<doc>
<float name="score">0.314803</float>
<str name="id">1</str>
<arr name="text_ws">
<str>David Bowie</str>
<str>David Robert Jones</str>
<str>Ziggy Stardust</str>
<str>Thin White Duke</str>
</arr>
</doc>
Y esta es la explicación:
<lst name="explain">
<str name="2">
0.4451987 = (MATCH) fieldWeight(text_ws:David in 1), product of: 1.0 = tf(termFreq(text_ws:David)=1) 0.71231794 = idf(docFreq=3, maxDocs=3) 0.625 = fieldNorm(field=text_ws, doc=1)
</str>
<str name="3">
0.44072422 = (MATCH) fieldWeight(text_ws:David in 2), product of: 1.4142135 = tf(termFreq(text_ws:David)=2) 0.71231794 = idf(docFreq=3, maxDocs=3) 0.4375 = fieldNorm(field=text_ws, doc=2)
</str>
<str name="1">
0.314803 = (MATCH) fieldWeight(text_ws:David in 0), product of: 1.4142135 = tf(termFreq(text_ws:David)=2) 0.71231794 = idf(docFreq=3, maxDocs=3) 0.3125 = fieldNorm(field=text_ws, doc=0)
</str>
</lst>
Los factores de puntuación aquí son:
- termFreq: cómo a menudo es un término aparece en el documento
- IDF: ¿con qué frecuencia aparece el término a través del índice de
- fieldNorm: importancia del término, según el índice de tiempo de impulso y la longitud del campo
En su ejemplo, el fieldNorm
hace la diferencia. Tiene un documento con termFreq
inferior (1 en vez de 1,4142135) ya que el término aparece solo una vez, pero esa coincidencia es más importante debido a la longitud del campo.
El hecho de que su campo sea multiValuado no cambia la puntuación. Supongo que sería lo mismo con un solo campo de valor con el mismo contenido. Solr funciona en términos de longitud de campo y términos, entonces, sí, David Bowie es castigado por tener muchas más fichas que los demás. :)
ACTUALIZACIÓN
De hecho, creo David Bowie merece su oportunidad. Como se explicó anteriormente, el fieldNorm
hace la diferencia. Agregue el atributo omitNorms=true
a su campo text_ws
en el schema.xml
y reindexe.La misma consulta le dará el siguiente resultado:
<doc>
<float name="score">1.0073696</float>
<str name="id">1</str>
<arr name="text">
<str>David Bowie</str>
<str>David Robert Jones</str>
<str>Ziggy Stardust</str>
<str>Thin White Duke</str>
</arr>
</doc>
<doc>
<float name="score">1.0073696</float>
<str name="id">3</str>
<arr name="text">
<str>David Hasselhoff</str>
<str>David Michael Hasselhoff</str>
</arr>
</doc>
<doc>
<float name="score">0.71231794</float>
<str name="id">2</str>
<arr name="text">
<str>David Letterman</str>
</arr>
</doc>
Como se puede ver ahora los termFreq
victorias y el fieldNorm
no se tiene en cuenta en absoluto. Es por eso que los dos documentos con dos ocurrencias de David están en la parte superior y con el mismo puntaje, a pesar de sus diferentes longitudes, y el documento más corto con solo un partido es el último con el puntaje más bajo. Aquí está la explicación con debugQuery=on
:
<lst name="explain">
<str name="1">
1.0073696 = (MATCH) fieldWeight(text:David in 0), product of: 1.4142135 = tf(termFreq(text:David)=2) 0.71231794 = idf(docFreq=3, maxDocs=3) 1.0 = fieldNorm(field=text, doc=0)
</str>
<str name="3">
1.0073696 = (MATCH) fieldWeight(text:David in 2), product of: 1.4142135 = tf(termFreq(text:David)=2) 0.71231794 = idf(docFreq=3, maxDocs=3) 1.0 = fieldNorm(field=text, doc=2)
</str>
<str name="2">
0.71231794 = (MATCH) fieldWeight(text:David in 1), product of: 1.0 = tf(termFreq(text:David)=1) 0.71231794 = idf(docFreq=3, maxDocs=3) 1.0 = fieldNorm(field=text, doc=1)
</str>
</lst>
gracias por el desglose detallado, eso es justo lo que necesitaba saber. ¿Hay alguna manera alternativa de indexar estos datos para que esos nombres se califiquen de manera más "justa"? – user605331
@ user605331 ¡Echa un vistazo a mi respuesta actualizada, también le di la oportunidad a David Bowie! – javanna
Omitir normas ayuda, pero no es una buena solución. Uno podría querer que fieldNorm se tenga en cuenta, pero aún tenga que usar campos multivalor. Así que tenemos que decidir entre estos dos :( –