2015-10-02 3 views
1

Я хочу достичь агрегации по уникальным парам (город, штат). Согласно документации Elasticsearch Термины агрегации не поддерживают сбор терминов из нескольких полей в том же документе. Таким образом, я создал вложенную AGG так:Агрегация Elasticsearch. Порядок по вложенному ковшу doc_count

{ 
    "size": 0, 
    "aggs": { 
    "cities": { 
     "terms": { 
     "field": "address.city", 
     "size": 12 
     }, 
     "aggs": { 
     "states": { 
      "terms": { 
      "field": "address.stateOrProvince" 
      }, 
      "aggs": { 
      "topCity": { 
       "top_hits": { 
       "size": 1, 
       "sort": [ 
        { 
        "price.value": { 
         "order": "desc" }}]}}}}}}}} 

В результате этого объединения я получаю ответ, как это:

{ 
    "aggregations": { 
    "cities": { 
     "buckets": [ 
     { 
      "key": "las vegas", 
      "doc_count": 5927, 
      "states": { 
      "buckets": [ 
       { "key": "nv", "doc_count": 5840 }, 
       { "key": "nm", "doc_count": 85 } 
      ] 
      } 
     }, 
     { 
      "key": "jacksonville", 
      "doc_count": 5689, 
      "states": { 
      "buckets": [ 
       { "key": "fl", "doc_count": 2986 }, 
       { "key": "nc", "doc_count": 1962 }, 
       { "key": "ar", "doc_count": 290 }]}}]}}} 

Вопрос в том, как получить результаты отсортированы по глубочайшей doc_count?

Ожидаемое упорядоченный список должен быть таким:

  1. Лас-Вегас (5840)
  2. Джексонвилле, фл (2986)
  3. Джексонвилле, штат Северная Каролина (1962)
  4. Джексонвилле, ар (290)
  5. лас-Вегас, нм (85)
+0

согласно вашему заказу у вас есть [два варианта] (https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html#_multi_field_terms_aggregation) aren ' они возможны? – keety

+0

@keety Я сначала попробовал второй вариант, и это неприемлемо, потому что мне нужно ** сохраненное поле not_analyzed **. Теперь я пытаюсь реализовать первый вариант, но получение «null, null» приводит к агрегации. Кажется, скрипт не объединяет значения. – IUnknown

ответ

2

Я не верю, что есть способ сортировки по внутреннему doc_count по нескольким ковшикам. В ES 2.0 (все еще в бета-версии), вы будете иметь возможность принять меры по агрегатам, но это не представляется возможным в ES 1.x

+0

Кажется, единственным решением является создание поля, которое было бы сочетанием обоих: города и состояния Я использую преобразование для достижения этого, но по какой-то причине я получаю «null, null» в результате агрегирования. "transform": { "script": "ctx._source ['address.city_state'] = ctx._source ['address.city'] + ',' + ctx._source ['address.state']" } – IUnknown

+0

вы можете получить что-то подобное для работы, просто помните о потенциальном воздействии производительности, которое может иметься на большом наборе данных в рабочей среде. – jhilden

0

мне удалось решить эту проблему путем применения transform

"transform": { 
    "script": "ctx._source['address']['cityState'] = ctx._source['address']['city'] + ', ' + ctx._source['address']['state']" 
} 

и затем агрегирование по вновь добавленному полю. Работает так, как ожидалось!

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