2015-07-30 2 views
14

Как добавить новый ключ с именем «agency_name» в мой выходной ковш.ElasticSearch - Как отобразить дополнительное имя поля в запросе агрегирования

Я бегу код агрегации, как показано ниже

{ 
    "aggs": { 
    "name": { 
     "terms": { 
     "field": "agency_code" 
     } 
    } 
    } 
} 

Я буду получать из положить в

"aggregations": { 
    "name": { 
     "doc_count_error_upper_bound": 130, 
     "sum_other_doc_count": 39921, 
     "buckets": [ 
      { 
       "key": "1000", 
       "doc_count": 105163 
      }, 
      { 
       "key": "2100", 
       "doc_count": 43006 
      } 
     ] 
    } 
} 

При отображении мне нужно, чтобы показать название агентства, код и doc_count

Как я могу изменить запрос агрегации, чтобы получить следующий формат. Я новичок в ElasticSearch, не знаю, как исправить эту

"aggregations": { 
    "name": { 
     "doc_count_error_upper_bound": 130, 
     "sum_other_doc_count": 39921, 
     "buckets": [ 
      { 
       "key": "1000", 
       "doc_count": 105163, 
       "agency_name": 'Agent 1' 
      }, 
      { 
       "key": "2100", 
       "doc_count": 43006, 
       "agency_name": 'Agent 2' 
      } 
     ] 
    } 
} 

Образец данных в ElasticSearch (поля Анализируются)

{ 

    "_index": "feeds", 
    "_type": "news", 
    "_id": "22005", 
    "_version": 1, 
    "_score": 1, 
    "_source": { 
     "id": 22005, 
     "name": "Test News", 
     "agency_name": "Agent 1", 
     "agency_code": "1000", 
    } 

} 

ответ

2

Я думаю, вам нужно будет добавить еще «Aggs» к нему. Но это было бы не в том формате, в котором вы хотите, а как в другом поле на выходе, поэтому в настоящее время вы агрегируете на основе «agency_code», а doc_count показывает, сколько раз происходит код конкретного агентства. Теперь, когда вы хотите скомпилировать его на основе «agency_name», поле может быть в разных документах, кроме «agency_code», а также в разных числах, если они всегда существуют в паре, чем это может означать индексирование родительского ребенка.

https://www.elastic.co/guide/en/elasticsearch/guide/current/indexing-parent-child.html

+0

похоже, что мне не нужно агрегировать на основе agency_name. Что я планировал, так или иначе я могу добавить настраиваемые поля к результату агрегации.Я добавил образец записи, чтобы показать, как данные хранятся в elasticsearch. –

+0

Привет @AmalKumarS Могу я знать, как вы решили эту проблему. – Kailash

+1

@ Kailash Мне не удалось получить имя агентства из результата агрегирования. То, что я сделал, это запуск отдельного запроса для присвоения кода агентства и агентства. Что отображает агрегированный результат, он использовал это сопоставление для отображения имени агентства :( –

1

Е.С. не имеет возможности узнать agency_name и agency_code карту один-к-одному. Поэтому я бы рекомендовал ряд возможных стратегий.

  • Не анализировать agency_name и использовать термин agg над этим полем. Я был бы удивлен, если вам действительно нужно сделать токенизацию agency_name.
  • Храните идентификатор для сопоставления имен в реляционной базе данных или плоском кеше файла и делайте клиентскую сторону соединения.
  • Храните документы агентства как другой тип и делайте два вызова. Первый, чтобы получить идентификаторы, а затем второй, чтобы найти агентства по идентификатору

Как упоминалось выше, Aditya Patel также может помочь родительским отношениям с детьми, но я считаю, что вам все равно придется использовать одну из вышеупомянутых стратегий для разрешения сопоставления имен id->.

+0

Я сохранил идентификатор для сопоставления имен в реляционной базе данных и сделал соединение на стороне клиента в качестве исправления –

6

Вы можете использовать агрегирование главных хитов, как в приведенной ниже ссылке. Формат будет немного отличаться, поскольку создание дополнительной агрегации будет вставлять название агентства под другой ключ «хиты».

Adding additional fields to ElasticSearch terms aggregation

{ 
    "aggs": { 
    "name": { 
     "terms": { 
     "field": "agency_code" 
     }, 
     "aggs": { 
     "agency_names" : { 
      "top_hits": { 
       size: 1, 
       _source: { 
        include: ['agency_name'] 
       } 
      } 
     } 
     } 
    } 
    } 
} 
2

Это старый пост, однако, я столкнулся с тем же проблемой, и я последовал тому, что дано в https://www.elastic.co/guide/en/elasticsearch/reference/current/agg-metadata.html. Добавьте данные метаданных, и они возвращаются как часть результата над ведром. Надеюсь, что это поможет кому-то в будущем.