No se encontró ninguna asignación para el campo para ordenar en ElasticSearch


Elasticsearch lanza una SearchParseException mientras analiza la consulta si se encuentran algunos documentos que no contienen el campo utilizado en los criterios de ordenación.

SearchParseException: Error de análisis [No se encontró ninguna asignación para [price] para ordenar]

¿Cómo puedo buscar con éxito estos documentos, incluso si a algunos les falta el campo price?

Author: Tristan, 2013-06-11

5 answers

Después de cavar más, encontré la solución como se indica a continuación. ignore_unmapped debe establecerse explícitamente a true en la cláusula sort.

"sort" : [
       { "rating": {"order" : "desc" , "ignore_unmapped" : true} },
       { "price": {"order" : "asc" , "missing" : "_last" , "ignore_unmapped" : true} }
]

Para obtener más información, eche un vistazo a las referencias de Elasticsearch para:

 91
Author: Yadu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-19 10:55:53

Para aquellos que buscan un ejemplo de ignore_unmapped y unmapped_type por favor vea mi respuesta aquí.

Tenga en cuenta que "ignore_unmapped" ahora está en desuso en favor de "unmapped_type". Esto se hizo como parte de #7039

De la documentación: Antes de la 1.4.0 estaba el parámetro booleano ignore_unmapped, que no era suficiente información para decidir los valores de ordenación a emitir, y no funcionaba para la búsqueda de índices cruzados. Todavía es compatible, pero los usuarios son se recomienda migrar al nuevo unmapped_type en su lugar.

De forma predeterminada, la solicitud de búsqueda fallará si no hay una asignación asociada a un campo. La opción unmapped_type permite ignorar los campos que no tienen asignación y no ordenarlos por ellos. El valor de este parámetro se utiliza para determinar qué valores de ordenació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 consultados no tiene una asignación de precio, Elasticsearch lo manejará como si hubo un mapeo de tipo long, con todos los documentos en este índice sin valor para este campo.

 31
Author: Navneet Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:31:11

Aparentemente ElasticSearch no ordenará los valores nulos. Estaba asumiendo que trataría a null como si estuviera al principio o al final (como con el ordenamiento SQL), pero creo que también desencadena este error.

Así que si ve este error, es posible que deba asegurarse de que el atributo sort tenga un valor predeterminado cuando se envíe 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 enviaba a ES como null.

Esta cuestión indica que los valores nulos están manejando, pero no fue mi experiencia. Es algo que vale la pena probar de todos modos.

 3
Author: mahemoff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-29 08:17:14

Experimenté el mismo problema (sorta; obtendría algunos errores, pero algunos resultados), pero en mi caso mi búsqueda se estaba emitiendo en la raíz (no se especificó ningún índice), y los errores que estaba obteniendo eran porque la búsqueda/orden también estaba buscando un índice Kibana.

Error estúpido, pero tal vez esto ayudará a alguien más que termina aquí.

 0
Author: James Boutcher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-03 17:40:25

Elasticsearch 6.4

Simplemente especifique el índice y eso es todo en Kibana

ANTES

GET /_search
{
 
  "query": {
    "exists": {
      "field": "document_id"
    }
  },
  "sort": [
    {
      "document_id": { "order": "asc"  },
      "created_at":  { "order": "desc" }
    }
  ]
}

DESPUÉS DE

GET /document-index/contact/_search  (here)
{

  "query": {
    "exists": {
      "field": "document_id"
    }
  },
  "sort": [
    {
      "document_id": { "order": "asc"  },
      "created_at":  { "order": "desc" }
    }
  ]
}
 0
Author: Brian Sanchez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-09 02:40:46