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