Problema con la consulta has_parent que contiene la función scscore
Tengo dos tipos de documentos, en una relación padre-hijo:
"myParent" : {
"properties" : {
"weight" : {
"type" : "double"
}
}
}
"myChild" : {
"_parent" : {
"type" : "myParent"
},
"_routing" : {
"required" : true
}
}
losweight
campo debe ser utilizado para puntuación / clasificación personalizada. Esta consulta directamente contra los documentos principales funciona de la forma prevista:
{
"query" : {
"function_score" : {
"script_score" : {
"script" : "_score * doc['weight'].value"
}
}
}
}
Sin embargo, al intentar hacer una puntuación similar para los documentos secundarios con unhas_parent
consulta, me sale un error:
{
"query" : {
"has_parent" : {
"query" : {
"function_score" : {
"script_score" : {
"script" : "_score * doc['weight'].value"
}
}
},
"parent_type" : "myParent",
"score_type" : "score"
}
}
}
El error es:
QueryPhaseExecutionException [[myIndex] [3]: consulta [filtrada (ParentQuery [myParent] (filtrada (puntuación de la función (ConstantScore (:), function = script [_score * doc ['weight']. value], params [null])) -> cache (_type: myParent))) -> cache (_type: myChild)], de [0], tamaño [10]: Error en la consulta [no se pudo reescribir el contexto]]; anidado: ElasticSearchIllegalArgumentException [No se encontró ningún campo para [peso] en el mapeo con tipos [myChild]];
Parece que en lugar de aplicar la función de puntuación al padre y luego pasar su resultado al niño, ES está tratando de aplicar la función de puntuación al niño, causando el error.
Si no usoscore
parascore_type
, el error no se produce, aunque las puntuaciones de los resultados son todas1.0
, según lo documentado.
¿Que me estoy perdiendo aqui? ¿Cómo puedo consultar estos documentos secundarios con una puntuación personalizada basada en un campo principal?