Elastic Search - Sort - переключение между целочисленными полями при условии 0
Скажем, у меня есть два поля двойного типа данных с именами priority1 и priority2. Нам нужно отсортировать по приоритету 1, но когда приоритет 1 равен 0, выберите поле приоритет 2.
Пример -
Document 1 - priority1 : 8.5, priority2 : 9.0
Document 2 - priority1 : 5.5, priority2 : 6.0
Document 3 - priority1 : 0, priority2 : 9.0
Document 4 - priority1 : 8.0, priority2 : 8.5
Document 5 - priority1 : 0, priority2 : 7.5
Документы должны быть отсортированы по порядку -
Document 2 (5.5)
Document 5 (7.5)
Document 4 (8.0)
Document 1 (8.5)
Document 3 (9.0)
1 ответ
Решение
Вы можете достичь этого, используя собственный сценарий оценки.
Следующий запрос:
POST test/scores/_search
{
"sort":{
"_script":{
"lang":"groovy",
"script" : "doc['priority1'].value == 0 ? doc['priority2'].value : doc['priority1'].value",
"type" : "number",
"order" : "asc"
}
}
}
даст вам заказ, который вы хотите:
hits": [
{
"_index": "test",
"_type": "scores",
"_id": "7uyu0prrT-SCJFvwSVUI0Q",
"_score": null,
"_source": {
"p1": 5.5,
"p2": 6
},
"sort": [
5.5
]
},
{
"_index": "test",
"_type": "scores",
"_id": "mRjUlMHvQ4-Dj-BKVL1Oyg",
"_score": null,
"_source": {
"p1": 0,
"p2": 7.5
},
"sort": [
7.5
]
},
{
"_index": "test",
"_type": "scores",
"_id": "QKCK2G9GT0y6FzwAvu5p5A",
"_score": null,
"_source": {
"p1": 8,
"p2": 8.5
},
"sort": [
8
]
},
{
"_index": "test",
"_type": "scores",
"_id": "4-kUu3gDSTON9F6bd3ieRw",
"_score": null,
"_source": {
"p1": 8.5,
"p2": 9
},
"sort": [
8.5
]
},
{
"_index": "test",
"_type": "scores",
"_id": "KOqf6bhrTK2JioRFEppcjw",
"_score": null,
"_source": {
"p1": 0,
"p2": 9
},
"sort": [
9
]
}
]
Вы можете иметь лучшую производительность, используя непосредственно function_score
запрос ( документация здесь) и повторное использование того же сценария в запросе.