Saltar al contenido

¿Es posible ordenar por rango en Elasticsearch?

Solución:

No es sencillo ordenar usando un campo de tipo de datos de rango. Aún así, puede usar la clasificación basada en scripts hasta cierto punto para obtener el resultado esperado.

por ejemplo, para simplificar el script, supongo que para todos sus documentos, los datos indexados contra my_range el campo tiene datos para gt y lte solo y desea ordenar en función de los valores mínimos de los dos, entonces puede agregar lo siguiente para ordenar:

{
  "query": {
    "bool": {
      "filter": [
        {
          "match": {
            "my_value": "hi"
          }
        },
        {
          "range": {
            "my_range": {
              "gt": 0,
              "lte": 200
            }
          }
        }
      ]
    }
  },
  "sort": {
    "_script": {
      "type": "number",
      "script": {
        "lang": "painless",
        "inline": "Math.min(params['_source']['my_range']['gt'], params['_source']['my_range']['lte'])"            
      },
      "order": "asc"
    }
  }
}

Puede modificar el script según sus necesidades de datos complejos que impliquen la combinación de todos lt, gt, lte, gte.

Actualizaciones (scripts para otros casos de uso diferentes):

1. Ordenar por diferencia

"Math.abs(params['_source']['my_range']['gt'] - params['_source']['my_range']['lte'])"

2. Ordenar por gt

"params['_source']['my_range']['gt']"

3. Ordenar por lte

"params['_source']['my_range']['lte']"

4. Ordenar si la consulta devuelve pocos documentos que no tienen range campo

"if(params['_source']['my_range'] != null) { <sorting logic> } else { return 0; }"

Reemplazar <sorting logic> con la lógica de clasificación requerida (que puede ser una de las 3 anteriores o la de la consulta)

return 0 puede ser reemplazado por return -1 o cualquier otro número según las necesidades de clasificación

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *