ElasticSearch - как отобразить дополнительное имя поля в агрегированном запросе

Как добавить новый ключ с именем "agency_name" в мой выходной блок.

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

{
  "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",
    }

}

Ответы

Ответ 1

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

Добавление дополнительных полей в агрегацию терминов ElasticSearch

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

У ES нет способа узнать, что agency_name и agency_code сопоставляются взаимно однозначно. Поэтому я бы рекомендовал ряд возможных стратегий.

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

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