Elasticsearch:聚合操作

这里写目录标题

一、聚合的概述

聚合(aggregations)可以让我们及其方便的实现对数据的统计、分析、运算。例如:

  • 什么品牌的手机最受欢迎
  • 这些手机的平均价格、最高价格、最低价格
  • 这些手机每月的销售情况如何

使用场景:

  • 电商平台的销售分析。
  • 社交媒体的用户行为分析。
  • 物流企业的运输分析。
  • 金融企业的交易分析。
  • 只能家具设备监控分析。

二、聚合的分类

1、指标聚合(Metric Aggregation)

  • 单值分析:只输出一个分析结果
    • min、max、avg、sum。
    • Cardinality(类似distinct Count)。
  • 多值分析:输出多个分析结果
  • stats(统计),extended stats。
  • percentile(百分位),percentile rank。
  • top hits(排在前面的示例)。

2、桶聚合(Bucket Aggregation)

按照一定的规则,将文档分配到不同的通中,从而达到分类的目的。ES提供的一些常见Bucket Aggregation。

  • Terms,需要字段支持fielddata

    • keyword默认支持fielddata
    • text需要在Mapping中开启fielddata,会按照分词后的结果进行分桶。
  • 数字类型

    • Range / Data Range。
    • Histogram(直方图) / Date Histogram。
  • 支持嵌套:也就在桶里再做分桶。

3、管道聚合(Pipeline Aggregation)

支持对聚合分析的结果,再次进行聚合分析。Pipeline的分析结果会输出到原结果中,根据位置的不同,分为两类:

  • Sibling - 结果和现有分析结果同级
    • Max,min, Avg&Sum Bucket
    • Stats, Extended status Bucket
    • Percentiles Bucket
  • Parent - 结果内嵌到现有的聚合分析结果之中
    • Derivative(求导)
    • Cumultive Sum(累计求和)
    • Moving Function(移动平均值)

三、ES聚合分析不精准原因分析

Elasticsearch在对海量数据进行聚合分析的时候损失搜索的精准度来满足实时性的需求。

四、聚合性能优化

1、ES聚合不精确的解决方案

  • 方案一:设置主分片为1。
    适用场景:数据量小的小集群规模业务场景。
  • 方案二:调大shard_size值。
    设置shard_size比较大的值,官方推荐:size*1.5+10。shard_size值越大,结果越趋于精准聚合结果值。此外,还可以通过show_term_doc_count_error参数显示最差情况下的错误值,用于辅助确定shard_size大小。
    • size:是聚合结果的返回值,客户期望返回聚合排名前三,size值就是3.
    • shard_size:每个分片上聚合的数据条数。shard_size原则上要大于等于size。
      适用场景:数据量大,分片数多的集群业务场景。
  • 方案三:将size设置为全量值,来解决精度问题。
    将size设置为2的32次方减去1也就是分片支持的最大值,来解决精度问题。
    原因:1.x版本,size等于0代表全部,高版本取消0值,所以设置了最大值(大于业务的全量值)。
    全量带来的弊端就是:如果分片数量极大,这样做会消耗巨大的CPU资源来排序,而且可能会阻塞网络。

适用场景:对聚合精准度要求极高的业务场景,由于性能问题,不推荐使用。

  • 方案四:使用clickhouse / spark进行精准聚合。
    适用场景:数据量非常大,聚合精准度要求高、响应速度快的业务场景。

2、ES聚合性能优化

(1)插入数据时对索引进行预排序

  • index sorting(索引排序)可用于在插入时对索引进行预排序,而不是在查询时再对索引进行排序,这将提高范围查询(range query)和排序操作的性能。
  • 在Elasticsearch中创建新索引时,可以配置如何对每个分片内的段进行排序。

注意:预排序将增加Elasticsearch写入的成本。在某些用户特定场景下,开启索引排序会导致大约40%~50%的写性能下降。也就是说,如果用户场景更关注写性能的业务,开启索引预排序不是一个很好的选择。

(2)适用节点查询缓存

节点查询缓存(Node query cache)可用于有效缓存过滤器(filter)操作的结果。如果多次执行同一个filter操作,这将很有效,但是即便更改过滤器中的某一个值,也将意味着需要计算新的过滤器结果。

你可以执行一个带有过滤器查询额搜索请求,Elasticsearch将自动尝试使用节点查询缓存来优化性能。例如,如果你想缓存一个基于特定字段值的过滤查询。

(3)适用分片请求缓存

聚合操作中,设置size为0,就会使用分片请求缓存缓存结果。size=0的含义是:只返回聚合结果,不返回查询结果。

(4)拆分聚合,使聚合并行化

Elasticsearch查询条件中同时有多个条件聚合,默认情况下聚合并不是并行运行的。当为每个聚合提供自己的查询并行执行msearch时,性能会有显著提升。因此,在CPU资源不是瓶颈的前提下,如果想缩短响应时间,可以将多个聚合拆分为多个查询,借助:msearch实现并行聚合。

相关推荐
天河归来8 小时前
第三方接口不稳定,如何让核心任务继续完成
java·大数据
GlobalInfo10 小时前
2026年全球机器人用超平执行器市场研究报告:市场规模达7.51亿美元,人形机器人商业化与轻量化运动控制需求推动行业增长
大数据·人工智能·数码相机·microsoft·机器人
IT古董11 小时前
《Agent开发工程师成长指南》- 第4章 第2节:Prompt设计五要素——任务、角色、上下文、约束与输出格式
大数据·人工智能·prompt
Allen_LVyingbo13 小时前
NVIDIA CUDA Tile 在医疗计算中的算子形式化、算法重构与内核实现
大数据·python·算法·重构·知识图谱·健康医疗·数据库架构
全栈陈序员14 小时前
【Git】从入门到精通(一)—— Git简介:什么是版本控制系统
大数据·git·elasticsearch
中国搜索直付通14 小时前
分账系统有风险吗?资金安全怎么保障?
大数据·支付通道·分账系统·分账支付
阿里云大数据AI技术15 小时前
云栖实录|阿里云AI搜索系列产品全新发布 - 新引擎
人工智能·elasticsearch
一枕槐安48715 小时前
微调 vs Prompt:业务场景下两种方案成本 & 效果对比
大数据·人工智能·prompt·混合架构·推理成本·行为固化·知识边界
SelectDB15 小时前
Apache Doris 与 SelectDB 是什么关系?从开源技术到面向 Agent 的极速分析数据库
大数据·数据库·数据分析
科技新资讯15 小时前
AI如何批量处理Excel文件? 从数据合并、清洗到自动生成报表,看看 AI Agent 怎么完成任务
大数据·人工智能·excel