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


117

Elasticsearch lanza una SearchParseExceptionconsulta de análisis temporal si se encuentran algunos documentos que no contienen el campo utilizado en los criterios de clasificación.

SearchParseException: Parse Failure [No se encontró ninguna asignación para [price] para ordenar]

¿Cómo puedo buscar con éxito estos documentos, incluso si faltan algunos pricecampos?


1
Tu pregunta / respuesta resolvió mi problema, gracias. Edité para generalizarlo un poco, siéntase libre de retroceder si eso no le conviene.
Paul Bellora

1
Referencia para manejar este problema Elasticsearch Link
Ajeesh

Respuestas:


116

Después de investigar más, encontré la solución que se indica a continuación. ignore_unmappeddebe establecerse explícitamente en trueen la cláusula de clasificación.

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

Para obtener más información, consulte las referencias de Elasticsearch para:


Hola, tengo el mismo problema y no entiendo cómo funciona ... Los atributos que faltan e ignore_unmapped deberían funcionar juntos, ¿verdad? Si, por ejemplo, configuro missing en "_last" e ignore_unmapped en "false", todavía tengo el problema, pero quiero que los documentos estén en los resultados en todos los casos, incluso si no tienen el atributo.
c4k

Tengo este problema y "ignore_unmapped" no funciona si su _type está vacío (es decir, sin ningún documento indexado).
reinaldoluckman

7
Parece que la nueva estrategia es usar unmapped_type
lukmdo

2
Mis consultas siempre funcionaron hasta hoy sin actualizar ninguna biblioteca, etc. pero hoy comencé a recibir este mismo error. Ahora agregué "ignore_unmapped" : truey comenzó a funcionar nuevamente, pero lo extraño es lo que sucedió detrás de la escena. ¡Quién sabe! De todos modos, funciona ahora. +1
BentCoder

1
¿Alguien puede aclarar la diferencia entre "faltante" y "no mapeado"? Para un determinado campo, si algunos documentos lo tienen y otros no, ¿se trata dicho campo como "faltante" o "sin asignar"? ¿"Falta" significa que el campo está en el documento pero el valor correspondiente es nulo?
Sher10ck

43

Para aquellos que buscan un ejemplo de ambos ignore_unmappedy unmapped_typepor 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 1.4.0 existía el parámetro booleano ignore_unmapped, que no era información suficiente para decidir los valores de clasificación que se emitían y no funcionaba para la búsqueda de índices cruzados. Todavía es compatible, pero se anima a los usuarios a migrar al nuevo unmapped_type.

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. El valor de este parámetro se utiliza para determinar qué valores de clasificación emitir. A continuación, se muestra un ejemplo de cómo se puede utilizar:

{
    "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, y todos los documentos de este índice no tienen valor para este campo.


3

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

Entonces, si ve este error, es posible que deba asegurarse de que el atributo de clasificación tenga un valor predeterminado cuando se envíe a ElasticSearch.

Tuve este error con Rails + ElasticSearch + Tire porque la columna de clasificación no tenía un valor predeterminado, por lo que se estaba enviando a ES como nulo.

Este problema indica que se están manejando valores nulos, pero no fue mi experiencia. De todos modos, vale la pena intentarlo.


2

Experimenté el mismo problema (más o menos; obtendría algunos errores, pero algunos resultados), pero en mi caso, mi búsqueda se emitía en la raíz (sin índice especificado), y los errores que recibía se debían a que la búsqueda / orden también era buscando un índice de Kibana.

Estúpido error, pero tal vez esto ayude a alguien más que termine aquí.


tengo el mismo problema ... pero cuando especifico ignorar sin asignar, no obtengo ninguna clasificación al buscar la raíz ... esto limita la capacidad de buscarme si tengo que definir el índice ... simplemente querría todo resultados coincidentes para ser ordenados por un campo si existe, y usar un uso predeterminado para aquellos que no. EDITAR:
mgoetzke

2

Elasticsearch 6.4

simplemente especifique el índice y eso es todo en Kibana

ANTES DE

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

DESPUÉS

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

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


0

También puede usar un script que le brinda cierta flexibilidad:

"sort" : {
    "_script" : {
        "type" : "number",
        "script" : {
            "lang": "painless",
            "source": "return !doc['price'].empty ? doc['price'].value : 0"
        },
        "order" : "desc"
    }
}

0

Cuando usamos el siguiente código, donde added_on es la fecha, ¿qué sucede? se analiza el texto de atributo, lo que significa que se divide en palabras distintas cuando se almacena, y permite búsquedas de texto libre en una o más palabras en el campo

por lo que hay "texto" y "palabra clave" asociados con los campos, por lo que si necesitamos utilizar la agregación en la consulta, necesitamos el valor del campo en general, la palabra clave.

BEFORE

"_source":{....}
"query" : {...}
"sort": [
{
  "added_on": {
    "order": "desc"
  }
}
]

AFTER
"_source":{....}
"query" : {...}
"sort": [
{
  "added_on.keyword": {
    "order": "desc"
  }
}
]
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.