在Elasticsearch聚合器之间建立关系-嵌套分组

时间:2019-02-22 07:34:22

标签: python elasticsearch elastic-stack

我需要在字段之间创建嵌套分组。

让我们考虑以下示例

文档:

 {
     "keyword": "abc",
     "country": "IN",
     "state": "TN",
     "city": "Chennai"
   },
   {
     "keyword": "abc",
     "country": "IN",
     "state": "TN",
     "city": "Trichy"
   },
   {
     "keyword": "abc",
     "country": "IN",
     "state": "KL",
     "city": "TVM"
   },
   {
     "keyword": "abc",
     "country": "US",
     "state": "Cal",
     "city": "California"
   }

必需的输出(类似这样):

   {
     "country": "IN",
     "TN": [
       "Chennai",
       "Trichy"
     ],
     "KL": [
       "TVM"
     ]
   },
   {
     "country": "US",
     "Cal": [
       "California"
     ]
   }

使用的查询:

 {
     "from": 0,
     "size": 1,
     "aggs": {
         "country": {
             "terms": {
                 "field": "country.keyword",
                 "size": 50000
             }
         },
         "state": {
             "terms": {
                 "field": "state.keyword",
                 "size": 50000
             }
         },
         "city": {
             "terms": {
                 "field": "city.keyword",
                 "size": 50000
             }
         }
     },
     "query": {
         "query_string": {
             "query": "(keyword:abc) "
         }
     }
 }

对于该查询,我将单独的存储桶作为城市,州和国家/地区的输出。

但是我需要的是城市应该在州下分组,州应该在国家下分组。

谢谢。

1 个答案:

答案 0 :(得分:1)

以下具有聚合功能的查询应为您工作

{
  "query": {
    "query_string": {
      "query": "(keyword:abc)"
    }
  }, 
  "size": 0, 
  "aggs": {
    "country_agg": {
      "terms": {
        "field": "country.keyword",
        "size": 10
      },
      "aggs": {
        "state_agg": {
          "terms": {
            "field": "state.keyword",
            "size": 10
          },
          "aggs": {
            "city_agg": {
              "terms": {
                "field": "city.keyword",
                "size": 10
              }
            }
          }
        }
      }
    }
  }
}