query - elasticsearch tutorial
Elasticsearch: "function_score" con "boost_mode": "replace" ignora el puntaje de la funciĆ³n (1)
Estoy tratando de modificar los puntajes de la consulta normal con diferentes funciones definidas en function_score.
Para saber qué puntajes calculados por mis funciones son, especifico "boost_mode" para "replace". Sin embargo, esto hace que todos los puntajes sean constantes: todos iguales a 1.
Considera seguir consulta:
{
"query": {
"function_score": {
"query": {
"terms": {
"name": ["men", "women"]
}
},
"score_mode": "avg",
"functions": [
{
"filter": {
"terms": {
"name": ["men","man"]
}
},
"weight": 2
}
],
"boost_mode": "replace"
}
},
"explain": true,
"from": 0
}
Espero obtener diferentes puntajes aquí, dependiendo de si el campo "nombre" contiene "hombres" o "hombre". Tales documentos están presentes en el índice seguro.
Además, si estoy especificando "explicar": verdadero, obtengo una puntuación en la explicación diferente a la que se muestra en el campo de puntuación _score:
{
"_shard":0,
"_node":"ro26nlDuTfiTaIlIgHqg4g",
"_index":"products10",
"_type":"product_basic",
"_id":"0c25fc90433481aac0cce62dd1a21e06",
"_score":1,
"_source":{
"category":[
"Chicago Blues",
"Blues",
"Styles",
"Digital Music"
],
"site_name":"www.amazon.com",
"name":"Who''s That Women?",
"url":"http://rads.stackoverflow.com/amzn/click/B001125F8I",
"price":0.99,
"reviews":[
],
"breadcrumb":"Digital Music",
"in_stock":true,
"features":[
],
"pic_urls":[
"http://ecx.images-amazon.com/images/I/51CvgPMwtsL.jpg",
"http://ecx.images-amazon.com/images/I/51CvgPMwtsL.jpg"
],
"name_semantic_core":[
"Women ?",
"?"
],
"category_path":"/Chicago Blues/Blues/Styles/",
"visit_datetime":"2014-11-04T11:50:34.169779",
"detected_category":"Digital Music"
},
"_explanation":{
"value":1.2249949,
"description":"function score, no filter match, product of:",
"details":[
{
"value":1.2249949,
"description":"product of:",
"details":[
{
"value":2.4499898,
"description":"sum of:",
"details":[
{
"value":2.4499898,
"description":"weight(name:women in 6181332) [PerFieldSimilarity], result of:",
"details":[
{
"value":2.4499898,
"description":"score(doc=6181332,freq=1.0), product of:",
"details":[
{
"value":0.67790973,
"description":"queryWeight, product of:",
"details":[
{
"value":7.228071,
"description":"idf(docFreq=238699, maxDocs=120967660)"
},
{
"value":0.09378847,
"description":"queryNorm"
}
]
},
{
"value":3.6140356,
"description":"fieldWeight in 6181332, product of:",
"details":[
{
"value":1,
"description":"tf(freq=1.0), with freq of:",
"details":[
{
"value":1,
"description":"termFreq=1.0"
}
]
},
{
"value":7.228071,
"description":"idf(docFreq=238699, maxDocs=120967660)"
},
{
"value":0.5,
"description":"fieldNorm(doc=6181332)"
}
]
}
]
}
]
}
]
},
{
"value":0.5,
"description":"coord(1/2)"
}
]
},
{
"value":1,
"description":"queryBoost"
}
]
}
}
Aquí la explicación muestra "valor": 1.2249949, mientras que "_score" es 1.
¿Qué estoy haciendo mal? ¿Cómo puedo obtener los puntajes reales calculados usando las funciones de functinon_score [antes de combinar con las puntuaciones de consulta originales]?
Actualización: esto es lo que obtengo si se encuentra un producto que coincida. Por alguna razón, la puntuación es 1 mientras que debería ser 2:
En su muestra, la función no coincide con ningún documento: function score, no filter match,
Además, a partir de la documentación cuando se usa replace, sucede lo siguiente: only function score is used, the query score is ignored
. Entonces, la situación es así: el filtro no coincide, por lo que no se computa ninguna puntuación, y replace
hará que la puntuación de la consulta se ignore y use la puntuación del filtro (que no existe porque no lo hizo). partido).
Y cuando la función no coincide, el valor predeterminado de la función es 1
. Puede verificar esto con "boost_mode": "sum"
. Mi opinión es que esta es la razón por la que ves una puntuación de 1
.
En cuanto al comportamiento avg
, esto no me parece bien y, lo más probable, es un error. Lo informé aquí: https://github.com/elastic/elasticsearch/issues/13732