elasticsearch获取数组类型和对应的分组聚合

5 篇文章 0 订阅
2 篇文章 0 订阅

1 先看下实体类的例子

People类

public class People {
    private String name;
    private Dog[] dogs;
}

Dog类

public class Dog {
    private String name;
    private String[] color;
}

es中的某一条数据

        "_source": {
          "dogs": [
            {
              "color": [
                "white"
              ],
              "name": "5BEhTUcWk90"
            },
            {
              "color": [
                "white"
              ],
              "name": "5BEhTUcWk91"
            },
            {
              "color": [
                "colorful"
              ],
              "name": "5BEhTUcWk92"
            },
            {
              "color": [
                "brown"
              ],
              "name": "5BEhTUcWk93"
            },
            {
              "color": [
                "black"
              ],
              "name": "5BEhTUcWk94"
            }
          ],
          "name": "5BEhTUcWk9"
        }

2 获取数据

2.1按照狗的颜色分组
GET mytest/_search
{
  "aggs": {
    "group_color": {
      "terms": {
        "field": "dogs.color.keyword"
      }
    }
  }
}

聚合结果

  "aggregations": {
    "group_color": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "colorful",
          "doc_count": 78
        },
        {
          "key": "white",
          "doc_count": 78
        },
        {
          "key": "black",
          "doc_count": 72
        },
        {
          "key": "brown",
          "doc_count": 71
        }
      ]
    }
  }
2.2按照people的第一条狗的颜色分组

上述的写法应该改成

GET mytest/_search
{
  "aggs": {
    "group_color": {
      "terms": {
        "script": {
          "inline": "params._source.dogs.get(0).color"
        }
      }
    }
  }
}

聚合结果

  "aggregations": {
    "group_color": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "white",
          "doc_count": 27
        },
        {
          "key": "brown",
          "doc_count": 26
        },
        {
          "key": "colorful",
          "doc_count": 26
        },
        {
          "key": "black",
          "doc_count": 21
        }
      ]
    }
  }

如果get(0)后面没有.color,那就是按照people的第一条狗分组,聚合结果是这样的

  "aggregations": {
    "group_color": {
      "doc_count_error_upper_bound": 1,
      "sum_other_doc_count": 90,
      "buckets": [
        {
          "key": "{color=[black], name=9f4sh9oshh0}",
          "doc_count": 1
        },
        {
          "key": "{color=[black], name=BnUQsPLMZQ0}",
          "doc_count": 1
        },
        {
          "key": "{color=[black], name=GFPCSW0ipH0}",
          "doc_count": 1
        },
		。。。。。。。。。。//省略几条,太多了
      ]
    }
  }
2.3假如我们get(100)试一下

GET mytest/_search
{
  "aggs": {
    "group_color": {
      "terms": {
        "script": {
          "inline": "params._source.dogs.get(100)"
        }
      }
    }
  }
}

结果当然报错了

    "root_cause": [
      {
        "type": "script_exception",
        "reason": "runtime error",
        "script_stack": [
          "java.util.ArrayList.rangeCheck(ArrayList.java:657)",
          "java.util.ArrayList.get(ArrayList.java:433)",
          "params._source.dogs.get(100)",
          "                   ^---- HERE"
        ],
        "script": "params._source.dogs.get(100)",
        "lang": "painless"
      }
    ]

我们发现里边报的是"java.util.ArrayList.get(ArrayList.java:433)",出现了ArrayList,挺有意思。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值