sorting - sort - No se encontró ningún mapeo para el campo para ordenar en ElasticSearch
sort elasticsearch (4)
Para aquellos que buscan un ejemplo de ambos
ignore_unmapped
yunmapped_type
, vea mi respuesta aquí .
Tenga en cuenta que "ignore_unmapped" ahora está en desuso en favor de "unmapped_type". Esto fue hecho como parte del #7039
De la documentación: Antes de 1.4.0 existía el parámetro booleano ignore_unmapped, que no era información suficiente para decidir sobre los valores de clasificación para emitir y no funcionaba para la búsqueda de índices cruzados. Todavía es compatible, pero se alienta a los usuarios a migrar al nuevo unmapped_type en su lugar.
De forma predeterminada, la solicitud de búsqueda fallará si no hay una asignación asociada con un campo. La opción unmapped_type permite ignorar los campos que no tienen mapeo y no ordenarlos por ellos. El valor de este parámetro se usa para determinar qué valores de clasificación emitir. Aquí hay un ejemplo de cómo se puede usar:
{
"sort" : [
{ "price" : {"unmapped_type" : "long"} },
],
"query" : {
"term" : { "user" : "kimchy" }
}
}
Si alguno de los índices que se consultan no tiene una asignación de precio, Elasticsearch lo manejará como si hubiera una asignación de tipo largo, con todos los documentos en este índice sin valor para este campo.
Elasticsearch arroja una SearchParseException
al analizar la consulta si hay algunos documentos encontrados que no contienen el campo utilizado en los criterios de clasificación.
SearchParseException: Parse Failure [No se encontró una asignación para [price] para ordenar]
¿Cómo puedo buscar estos documentos con éxito, incluso si a algunos les falta el campo de price
?
Aparentemente, ElasticSearch no ordenará los valores nulos. Asumí que trataría el nulo como al principio o al final (como con el orden SQL) pero creo que también desencadena este error.
Por lo tanto, si ve este error, es posible que deba asegurarse de que el atributo de clasificación tenga un valor predeterminado cuando se envía a ElasticSearch.
Tuve este error con Rails + ElasticSearch + Tire porque la columna de ordenación no tenía un valor predeterminado, por lo que se envió a ES como nulo.
Este problema indica que los valores nulos se están manejando, pero no fue mi experiencia. Es algo que vale la pena intentar de todos modos.
Después de excavar más, encontré la solución como se muestra a continuación. ignore_unmapped
debe establecer explícitamente como true
en la cláusula de ordenación.
"sort" : [
{ "rating": {"order" : "desc" , "ignore_unmapped" : true} },
{ "price": {"order" : "asc" , "missing" : "_last" , "ignore_unmapped" : true} }
]
Para más información, eche un vistazo a las referencias de Elasticsearch para:
Experimenté el mismo problema (es decir, recibía algunos errores, pero algunos resultados), pero en mi caso mi búsqueda se emitía en la raíz (no se especificaba ningún índice), y los errores que recibía eran porque la búsqueda / orden también era mirando a un índice Kibana.
Estúpido error, pero tal vez esto ayude a alguien más que termina aquí.