前言
elasticsearch中如何实现多字段聚合统计?类似于mysql的:
select a,b from my_table group by a,b;
golang如何借助第三方类oliver elastic实现es原生DSL(domain special language 特殊领域查询语言)的构造?
希望看完这篇文章,对你有所帮助。
正文
单字段聚合
先来看单字段聚合统计的es原生DSL语句的写法:
{
"query": {
"bool": {
"must": [
{
"query_string": {
"query": "baidu",
"fields": [
"sample_hash.raw",
"program_name.raw",
"package_name.raw"
]
}
}
],
"filter": [
{
"range": {
"record_time": {
"gte": "2016-09-01",
"lte": "2020-07-24"
}
}
},
{
"match": {
"sample_state": "B"
}
}
]
}
},
"aggs": {
"packageNameGroup": {
"terms": {
"field": "package_name.raw",
"size": 1000,
"min_doc_count": 1,
"shard_min_doc_count": 0,
"show_term_doc_count_error": false
}
}
}
}
为什么aggs.packageNameGroup.field的值需要在字段末尾加上.raw呢?
先看咱们的index的mapping设置是:
curl -XGET 'event Cluster/tip_sample_info_v2/info/_mapping'

看到这个字段的定义,你第一感觉是什么?如果你对mapping的字段定义有一定的认知,你应该会有所疑惑?
为啥外层的type是text,内容type是keyword?那么这个字段到底是text,还是keyword?
看官方解释:


大致意思是,针对index的mapping的字段类型的定义,可以定义为复合类型,一般就是keyword+text的组合,来达到一个字段加不加.raw后缀,有不同的含义;毕竟聚合、排序只能针对keyword类型;
那么不加.raw可以聚合查询吗?看下面这个查询,

报错的意思是,Fielddata这个设置默认是关闭的,你现在想针对text类型做聚合统计,那么你可以打开这个Fielddata选项;
但是,据说这个选项开启很吃资源,一般不会为了聚合,来开启Fielddata选项的,还不如给聚合的text字段设置.raw的属性为keyword;
多字段聚合
接下来,多字段聚合怎么写呢?
curl -XPOST 'event Clu

本文介绍如何在Elasticsearch中使用多字段聚合统计,包括单字段和多字段的DSL语法,以及如何通过Golang的oliverelastic库构造原生聚合查询。适合对聚合查询和DSL有深入理解的需求者。

4万+

被折叠的 条评论
为什么被折叠?



