1.5 Elasticsearch DSL 聚合语法介绍

课程环境


数据准备

  • 先删除前面章节的索引:DELETE /product_index?pretty
  • 创建带有 Tags 的索引数据:
PUT /product_index/product/1
{
  "product_name": "PHILIPS toothbrush HX6730/02",
  "product_desc": "【3?9 元,前 1000 名赠刷头,6 月 1 日 0 点火爆开抢,618 开门红巅峰 48 小时,抢先加入购物车】飞利浦畅销款,万千好评!深入净齿,智能美白!",
  "price": 399.00,
  "tags": [
    "toothbrush",
    "PHILIPS"
  ]
}

PUT /product_index/product/2
{
  "product_name": "Braun toothbrush 2000 3D",
  "product_desc": "6 月 1 日 16 点秒杀,仅 329 元!限量 1000 支,抢完即止!带压力感应提醒,保护牙龈,高效清洁",
  "price": 499.00,
  "tags": [
    "toothbrush",
    "Braun"
  ]
}

PUT /product_index/product/3
{
  "product_name": "iphone7 shell",
  "product_desc": "一说到星空,就有太多美好的记忆,美丽的浩瀚宇宙,有太多说不清的神秘之处,星空太美丽,太绚烂!",
  "price": 36.00,
  "tags": [
    "iphone7",
    "phone",
    "shell"
  ]
}

简单分析案例

计算每个 tag 下的商品数量,自己取一个分组聚合结果名称:product_group_by_tags

GET /product_index/product/_search
{
  "aggs": {
    "product_group_by_tags": {
      "terms": {
        "field": "tags"
      }
    }
  }
}

GET /product_index/product/_search
{
  "size": 0, ## 不显示 hits 原数据,只显示聚合统计结果
  "aggs": {
    "product_group_by_tags": {
      "terms": {
        "field": "tags"
      }
    }
  }
}
  • 聚合得到的结果如下:
{
  "took": 9,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 3,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "product_group_by_tags": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "toothbrush",
          "doc_count": 2
        },
        {
          "key": "braun",
          "doc_count": 1
        },
        {
          "key": "iphone7",
          "doc_count": 1
        },
        {
          "key": "philips",
          "doc_count": 1
        },
        {
          "key": "phone",
          "doc_count": 1
        },
        {
          "key": "shell",
          "doc_count": 1
        }
      ]
    }
  }
}
  • 默认情况下你应该会报一个这样的错误

Fielddata is disabled on text fields by default. Set fielddata=true on [tags] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory.

  • 解决办法,给 tags 字段的 fielddata 设置为 true:
PUT /product_index/_mapping/product
{
  "properties": {
    "tags": {
      "type": "text",
      "fielddata": true
    }
  }
}

搜索商品名称中包含 toothbrush 的商品结果中,计算每个 tag 下的商品数量

GET /product_index/product/_search
{
  "size": 0,
  "query": {
    "match": {
      "product_name": "toothbrush"
    }
  },
  "aggs": {
    "query_product_group_by_tags": {
      "terms": {
        "field": "tags"
      }
    }
  }
}

搜索商品名称中包含 toothbrush 的商品结果中,先用 tags 字段进行分组,然后再计算每组中商品价格的平均值

GET /product_index/product/_search
{
  "size": 0,
  "query": {
    "match": {
      "product_name": "toothbrush"
    }
  },
  "aggs": {
    "query_product_group_by_tags_and_avg": {
      "terms": {
        "field": "tags"
      },
      "aggs": {
        "product_price_avg_price": {
          "avg": {
            "field": "price"
          }
        }
      }
    }
  }
}

搜索商品名称中包含 toothbrush 的商品结果中,先用 tags 字段进行分组,然后再计算每组中商品价格的平均值,并按平均价格进行倒序

GET /product_index/product/_search
{
  "size": 0,
  "query": {
    "match": {
      "product_name": "toothbrush"
    }
  },
  "aggs": {
    "query_product_group_by_tags_and_avg": {
      "terms": {
        "field": "tags",
        "order": {
          "product_price_avg_price": "desc"
        }
      },
      "aggs": {
        "product_price_avg_price": {
          "avg": {
            "field": "price"
          }
        }
      }
    }
  }
}

搜索商品名称中包含 toothbrush 的商品结果中,按照指定的价格范围区间进行分组聚合,然后再按 tag 进行分组,最后再计算每组的平均价格

GET /product_index/product/_search
{
  "size": 0,
  "query": {
    "match": {
      "product_name": "toothbrush"
    }
  },
  "aggs": {
    "proudct_group_by_price": {
      "range": {
        "field": "price",
        "ranges": [
          {
            "from": 0,
            "to": 300
          },
          {
            "from": 300,
            "to": 400
          },
          {
            "from": 400,
            "to": 1000
          }
        ]
      },
      "aggs": {
        "product_group_by_tags": {
          "terms": {
            "field": "tags"
          },
          "aggs": {
            "product_average_price": {
              "avg": {
                "field": "price"
              }
            }
          }
        }
      }
    }
  }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Cloud Native - 产品级敏捷

微服务架构 (五): 获取微服务数据, 生成报表

2016.8.17, 深圳, Ken Fang 架构师在设计从多个微服务取数据, 而生成报表的架构设计方案时, 往往面临著需在边界上下文 (Bounded Co...

21410
来自专栏hbbliyong

JAVA试练塔之试炼技能图

1.计算机基础: 1.1数据机构基础: 主要学习: 1.向量,链表,栈,队列和堆,词典。熟悉 2.树,二叉搜索树。熟悉 3.图,有向图,无向图,基本概念 4.二...

3847
来自专栏康怀帅的专栏

Ubuntu 常用软件

本文列举了 Ubuntu 常用软件。 娱乐 网易云音乐 http://music.163.com/#/download mpv 播放器 https://mpv....

4865
来自专栏数据和云

DBA生存警示:系统级误删除案例及防范建议

编辑手记:对于资深的老DBA们,他们在漫长的职业生涯中养成了很多稀奇古怪的守则,以在复杂多变的环境中“幸存”,这源于无数血泪的教训,我曾经在《数据安全警示录》...

2874
来自专栏程序猿DD

极大提高工作效率的几十种神兵利器

来源:https://www.liutf.com/posts/3720794851.html

2193
来自专栏吉浦迅科技

DAY 75:阅读Configuration Options

我们正带领大家开始阅读英文的《CUDA C Programming Guide》,今天是第75天,我们正在讲解CUDA 动态并行,希望在接下来的25天里,您可以...

1282
来自专栏大数据挖掘DT机器学习

Python实现爬取知乎神回复

这篇文章主要介绍了Python实现爬取知乎神回复简单爬虫代码分享,本文实现了爬取知乎的“如何正确地吐槽”收藏夹,是对个人的一个兴趣实现,需要的朋友可以参考下。 ...

3475
来自专栏向治洪

Android逆向工程

在Root前提下,我们可以使用Hooker方式绑定so库,通过逆向方式篡改数值,从而达到所谓破解目的。然而,目前无论是软件加固方式,或是数据处理能力后台化,还是...

29310
来自专栏SDNLAB

CacheP4:一个关于可编程数据平面缓存机制的设想

前言 2014年, 网络领域顶级会议SIGCOMM的一篇论文“P4: Programming Protocol-independent Packet Proce...

3658
来自专栏JavaEdge

Druid入门应用场景存储系统选择Druid介绍

设计一个系统来预估未来一年的广告流量,不是总流量,是任意时间段任何定向(Targeting)条件约束情况下的流量。定向条件有近百种(内容类别,设备平台,用户地域...

4314

扫码关注云+社区

领取腾讯云代金券