terminate_after query example elastic search elasticsearch

query - ElasticSearch: aumentar la relevancia en función del valor del campo



elasticsearch terminate_after example (3)

Es necesario encontrar una forma en ElasticSearch para aumentar la relevancia de un documento en función de un valor particular de un campo. Específicamente, hay un campo especial en todos mis documentos donde cuanto mayor es el valor del campo, más relevante debe ser el documento que lo contiene, independientemente de la búsqueda.

Considere la siguiente estructura de documento:

{ "_all" : {"enabled" : "true"}, "properties" : { "_id": {"type" : "string", "store" : "yes", "index" : "not_analyzed"}, "first_name": {"type" : "string", "store" : "yes", "index" : "yes"}, "last_name": {"type" : "string", "store" : "yes", "index" : "yes"}, "boosting_field": {"type" : "integer", "store" : "yes", "index" : "yes"} } }

Me gustaría que los documentos con un mayor valor de boosting_field sean intrínsecamente más relevantes que aquellos con un valor de boosting_field más bajo. Este es solo un punto de partida: la concordancia entre la consulta y los demás campos también se tendrá en cuenta al determinar el puntaje de relevancia final de cada documento en la búsqueda. Pero, si todo lo demás es igual, cuanto mayor sea el campo de impulso, más relevante será el documento .

Alguien tiene una idea sobre cómo hacer esto?

¡Muchas gracias!


Con una versión reciente de Elasticsearch (versión 1.3+), querrá usar "consultas de puntuación de función":

function_score

Una búsqueda de query_string puntuada tiene este aspecto:

{ ''query'': { ''function_score'': { ''query'': { ''query_string'': { ''query'': ''my search terms'' } }, ''functions'': [{ ''field_value_factor'': { ''field'': ''my_boost'' } }] } } }

"my_boost" es un campo numérico en su índice de búsqueda que contiene el factor de impulso para documentos individuales. Puede verse así:

{ "my_boost": { "type": "float", "index": "not_analyzed" } }


Puede aumentar el tiempo de indexación o el tiempo de consulta. Por lo general, prefiero aumentar el tiempo de consulta a pesar de que hace que las consultas sean un poco más lentas, de lo contrario necesitaría volver a indexar cada vez que quiera cambiar mis factores de potenciación, que usualmente necesitan ajustes y deben ser bastante flexibles.

Existen diferentes formas de aplicar el aumento del tiempo de consulta utilizando la consulta DSL de búsqueda elástica:

Las primeras tres consultas son útiles si desea dar un impulso específico a los documentos que coinciden con consultas o filtros específicos. Por ejemplo, si desea aumentar solo los documentos publicados durante el último mes. Podrías usar este enfoque con tu boosting_field, pero necesitarías definir manualmente algunos intervalos de boosting_field y darles un impulso diferente, que no es tan bueno.

La mejor solución sería utilizar una consulta de puntuación personalizada , que le permite realizar una consulta y personalizar su puntuación mediante un script. Es bastante poderoso, con el script puedes modificar directamente el puntaje en sí mismo. En primer lugar, ampliaría los valores de boosting_field a un valor de 0 a 1, por ejemplo, para que su puntaje final no se convierta en un gran número. Para hacer eso, necesita predecir cuáles son más o menos los valores mínimo y máximo que el campo puede contener. Digamos mínimo 0 y máximo 100000 por ejemplo. Si escala el valor boosting_field a un número entre 0 y 1, entonces puede agregar el resultado a la puntuación real de esta manera:

{ "query" : { "custom_score" : { "query" : { "match_all" : {} }, "script" : "_score + (1 * doc.boosting_field.doubleValue / 100000)" } } }

También puede considerar usar boosting_field como un factor de impulso ( _score * lugar de _score + ), pero luego deberá escalarlo a un intervalo con valor mínimo 1 (solo agregue un +1).

Incluso puede ajustar el resultado para que cambie la importancia de agregar un peso al valor que usa para influir en el puntaje. Necesitará esto aún más si necesita combinar múltiples factores impulsores para darles un peso diferente.


si desea evitar hacer el aumento cada vez que ingrese a la consulta, puede agregarla directamente a su mapeo agregando "boost: factor".

Entonces su mapeo puede verse así:

{ "_all" : {"enabled" : "true"}, "properties" : { "_id": {"type" : "string", "store" : "yes", "index" : "not_analyzed"}, "first_name": {"type" : "string", "store" : "yes", "index" : "yes"}, "last_name": {"type" : "string", "store" : "yes", "index" : "yes"}, "boosting_field": {"type" : "integer", "store" : "yes", "index" : "yes", "boost" : 10.0,} } }