2016-06-01 4 views
0

У меня есть несколько полей, которые я хочу отсортировать вместе, чтобы они получили одинаковый приоритет.Elasticsearch сортировать по нескольким названиям полей

В настоящее время мой сортировки выглядит следующим образом:

"sort": [ 
    { 
    "stats.favoriteCount": { 
     "order": "desc", 
     "missing": 0 
    }, 
    "stats.likeCount": { 
     "order": "desc", 
     "missing": 0 
    } 
    } 
] 

Моя проблема с этим состоит в том, что favoriteCount всегда будет рассматриваться первым, даже если likeCount имеет более высокие значения.

Так для 2 документов, которые имеют:

1: {"stats.favoriteCount": 50, "likeCount": 0} 
2: {"stats.favoriteCount": 0, "likeCount": 70} 

Первый документ будет более высоким рейтинг, так как Elasticsearch транслирует сортировку: [50,0] и [0,70].

Можно ли каким-либо образом обрабатывать эти 2 поля как равные в сортировке?

ответ

0

Я поправки Andrei Stefan's answer (спасибо!) Это:

{ 
    "sort": { 
    "_script": { 
     "type": "number", 
     "script": "return max(doc['stats.favoriteCount'].value,doc['stats.likeCount'].value)", 
     "lang": "groovy", 
     "order": "desc" 
    } 
    } 
} 
1

Я думаю, вам нужна сортировка сценариев. Что-то вроде этого:

{ 
    "sort": { 
    "_script": { 
     "type": "number", 
     "script": "if (doc['stats.favoriteCount'].value>doc['stats.likeCount'].value) return doc['stats.favoriteCount'].value; return doc['stats.likeCount'].value;", 
     "lang": "groovy", 
     "order": "desc" 
    } 
    } 
} 
+0

Спасибо! это переместилось много в правильном направлении, я закончил использование 'max (val1, val2)' – AlexD

+0

Да, подход 'max' намного чище и компактнее :-). –