2014-10-16 5 views
4

В настоящее время я сортировочные агрегирование по документу счета, поэтому большинство соответствующих пункты приходят первые в списке агрегации, как показано ниже:Elasticsearch два уровня сортировка в списке агрегации

{ 
      'aggs' : { 
       'guilds' : { 
        'terms' : { 
         'field' : 'guilds.title.original', 
         'order' : [{'max_score' : 'desc'}], 
         'aggs' : { 
          'max_score' : { 
           'script' : 'doc.score' 
          } 
         } 
        } 
       } 
      } 
     } 

Я хочу добавить еще один вариант сортировки в заказ условия массив в моем JSON. но когда я делаю это вот так:

{ 
     'order' : [{'max_score' : 'desc'}, {"_count" : "desc"}, 
    } 

Второй вид не работает. Например, когда все баллы равны, он должен сортировать по запросу, но он не работает.

ответ

7

В поправке к ответу Андрея ... заказать агрегирование по нескольким критериям, вы MUST создайте массив, как показано в Terms Aggregation: Order, и вы: ДОЛЖНЫ использовать ElasticSearch 1.5 или новее.

Таким образом, для ответа Андрея, коррекция: "order" : [ { "max_score": "desc" }, { "_count": "desc" } ]

Как у Андрея это, ES не будет жаловаться, но это будет ТОЛЬКО использовать последний элемент, указанный в элементе «порядка».

7

Я не знаю, как работают ваши агенты, потому что я попробовал это, и у меня были синтаксические ошибки в трех местах: «порядок» не имеет такой структуры массива, должны быть размещены ваши «агги» за пределами первых «терминов» aggs и, наконец, aggs «max_score» должны иметь «максимальный» тип «aggs». В моем случае, чтобы сделать его работу (и это на самом деле заказ правильно), он должен выглядеть следующим образом:

"aggs": { 
    "guilds": { 
     "terms": { 
     "field": "guilds.title.original", 
     "order": { 
      "max_score": "desc", 
      "_count": "desc" 
     } 
     }, 
     "aggs": { 
     "max_score": { 
      "max": { 
      "script": "doc.score" 
      } 
     } 
     } 
    } 
    } 
+2

Andrei - попробовав то, что вы предлагаете выше, я обнаружил, что ES просто выполняет упорядочение на основе последнего элемента в элементе «order». По моему сценарию, я хочу заказать в поле «ранг» (в котором будут «связи» между терминами), которые затем я хочу подсортировать в них по лучшим средним значениям doc. Какой бы из этих двух «заказов» я не указывал последний, это то, что он использовал. Я не вижу никакого способа подзаголовки. –

+0

@ThomasDoman: У меня точно такая же проблема - упорядочение происходит на основе последнего элемента в списке. Вы нашли решение проблемы? Благодаря ! – UD1989

+1

@ UD1989 - Я уверен, что мой ответ ниже в виде исправления ответа Андрея. Обязательно поддержите его, спасибо! –

Смежные вопросы