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

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,挺有意思。

猜你喜欢

转载自blog.csdn.net/weixin_46269980/article/details/106326391