Агрегат Elasticsearch на вложенных данных JSON - PullRequest
3 голосов
/ 09 июля 2019

Я должен сделать некоторые агрегации на данных JSON. Я видел несколько ответов здесь на stackoverflow, но у меня ничего не получалось. У меня есть несколько строк и в столбце timeCountry у меня есть массив, в котором хранятся объекты JSON. с подсчетом ключей, страна_имя, s_name.

Я должен найти сумму всех строк в соответствии с s_name, Пример - если в 1-й строке timeCountry содержит массив, как показано ниже

[ {
      "count": 12,
      "country_name": "america",
      "s_name": "us"
    },
    {
      "count": 10,
      "country_name": "new zealand",
      "s_name": "nz"
    },
    {
      "count": 20,
      "country_name": "India",
      "s_name": "Ind"
    }]

Данные строки 2 как ниже

[{
  "count": 12,
  "country_name": "america",
  "s_name": "us"
  },
  {
  "count": 10,
  "country_name": "South Africa",
  "s_name": "sa"
  },
  {
  "count": 20,
  "country_name": "india",
  "s_name": "ind"
  }]

вроде так.

Мне нужен результат, как показано ниже

[{
        "count": 24,
        "country_name": "america",
        "s_name": "us"
    }, {
        "count": 10,
        "country_name": "new zealand",
        "s_name": "nz"
    },
    {
        "count": 40,
        "country_name": "India",
        "s_name": "Ind"
    }, {
        "count": 10,
        "country_name": "South Africa",
        "s_name": "sa"
    }
]

приведенные выше данные относятся только к одной строке, у меня есть несколько строк timeCountry это столбец

То, что я пытался написать для агрегирования

{
   "query": {
      "match_all": {}
   },
   "aggregations":{
        "records" :{
            "nested":{
                "path":"timeCountry"
            },
            "aggregations":{
                "ids":{
                    "terms":{
                        "field": "timeCountry.country_name"
                    }
                }
            }
        }
   }

}

Но это не работает Пожалуйста, помогите

1 Ответ

1 голос
/ 12 июля 2019

Я попробовал это на своем локальном эластичном кластере и смог получить агрегированные данные по вложенным документам. В зависимости от вашего отображения индекса ответ может отличаться от моего. Ниже приведен DSL, который я использовал для агрегации:

{
    "aggs" : {
        "records" : {
            "nested" : {
                "path" : "timeCountry"
            },
            "aggs" : {
                "ids" : { "terms" : {
                    "field" : "timeCountry.country_name.keyword"
                },
               "aggs": {"sum_name": { "sum" : { "field" : "timeCountry.count" } } }
               }
            }
        }
    }
}

Ниже приведено сопоставление моего индекса:

{
    "settings" : {
        "number_of_shards" : 1
    },
    "mappings": {
        "agg_data" : {
        "properties" : {
            "timeCountry" : {
                "type" : "nested"
            }
        }
    }
    }
}
...