es 多字段聚合 in golang

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

前言

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值