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