Elasticsearch对嵌套列表中的值的聚合(数组)

时间:2018-11-16 03:24:32

标签: elasticsearch elasticsearch-aggregation

我已经在Elasticsearch嵌套数据类型(数组)中存储了一些值,但是没有使用键/值对。记录示例为:

{
  "categories": [
  "Category1",
  "Category2"
  ],
  "product_name": "productx"
}

现在,我想运行聚合查询以查找可用类别的唯一列表。但是我看到的所有示例都指向具有键/值的映射。有什么方法可以按原样使用上述架构,还是需要将架构更改为类似的格式才能运行聚合查询

{
  "categories": [
     {"name": "Category1"},
     {"name": "Category2"}
  ],
  "product_name": "productx"
}

1 个答案:

答案 0 :(得分:0)

关于JSON结构,您需要退后一步来确定是否要使用listkey-value对。

以您的示例为例,我认为您不需要key-value对,但如果categories还有更多属性,则可能需要通过了解您的域来澄清。

就聚合而言,据我所知,aggregations适用于任何有效的JSON结构。

对于您提到的数据,可以使用下面的aggregation查询。另外,我假设这些字段的类型为keyword

汇总查询

POST <your_index_name>/_search
{
  "size": 0,
  "aggs": {
    "myaggs": {
      "terms": {
        "size": 100,
        "script": {
          "inline": """
            def myString = "";
            def list = new ArrayList();
            for(int i=0; i<doc['categories'].length; i++){
              myString = doc['categories'][i] + ", " + doc['product'].value;
              list.add(myString);
            }
            return list;
            """
        }
      }
    }
  } 
}

聚集响应

{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "myaggs": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "category1, productx",
          "doc_count": 1
        },
        {
          "key": "category2, productx",
          "doc_count": 1
        }
      ]
    }
  }
}

希望有帮助!