作者:来自 Elastic Alexander Dávila

了解如何使用 significant terms 聚合来发现你数据中的洞察。

更多阅读:Elasticsearch:significant terms aggregation

Elasticsearch 拥有大量新功能,可以帮助你为你的使用场景构建最佳搜索解决方案。深入查看我们的示例 notebooks 了解更多信息,开始免费云试用,或立即在本地机器上体验 Elastic。


在 Elasticsearch 中, significant terms 聚合不仅仅是找出最常见的词项,而是发现数据集中统计上不寻常的值。这使我们能够发现有价值的洞察和非显而易见的模式。 significant terms 聚合的响应中包含两个有用的参数:

  • bg_count(背景计数):在父数据集中找到的文档数量
  • doc_count:在结果数据集中找到的文档数量

例如,在一个手机销售数据集中,我们可以像下面这样对 iPhone 16 的销售查找 significant terms:

GET phone_sales_analysis/_search
{"size": 0,"query": {"term": {"phone_model": {"value": "iPhone 16"}}},"aggs": {"significant_cities": {"significant_terms": {"field": "city_region","size": 1}}}
}

然后,响应会给出:

{"aggregations": {"significant_cities": {"doc_count": 122,"bg_count": 424,"buckets": [{"key": "Houston","doc_count": 12,"score": 0.1946481360617346,"bg_count": 14}]}}
}

Houston 并不是整个数据集中排名前十的城市,也不是 iPhone 16 的销量最高城市。然而, significant terms 聚合显示,与数据集的其余部分相比,iPhone 16 在这个城市的购买量不成比例地偏高。让我们更深入地看看数据:

  • 在顶层:
    • doc_count: 122 — 查询总共匹配了 122 个文档
    • bg_count: 424 — 背景集(所有销售文档)包含 424 个文档
  • 在 Houston 的 bucket 中:
    • doc_count: 12 — 在 122 个查询结果中,Houston 出现了 12 次
    • bg_count: 14 — 在背景数据集的 424 个文档中,Houston 出现了 14 次

这告诉我们,在总共 424 笔购买中,只有 14 笔发生在 Houston,占比为 3.3%。但如果我们只看 iPhone 16 的销售,就会发现有 12 笔发生在 Houston,占比为 9.8%,是整体数据集的 3 倍,这就是 “significant”!

下面是这个分析在可视化中的表现:每个 city_region 的总销量。

我们可以看到 Houston 有 14 笔销售,在数据集中按销量排名第 14。

现在,如果我们应用一个过滤器,仅查看 iPhone 16 的销售,Houston 有 12 笔销售,成为该型号销量第 2 高的城市:

了解 significant terms 聚合

根据 Elastic 文档, significant terms 聚合:

“(查找)在前景集和背景集之间受欢迎程度发生显著变化的词项。”

这意味着它使用统计指标将某个词项在数据子集(前景集)中的频率与在整个父数据集(背景集)中的频率进行比较。这样,评分反映的是统计显著性,而不是某个词项在数据中出现的次数。

significant terms 聚合与普通 terms 聚合的主要区别在于:

  • significant terms 比较的是数据的一个子集,而 terms 聚合只处理查询结果数据集。

  • terms 聚合返回的是数据集中最常见的词项,而 significant terms 会忽略常见词项,找出让数据子集独特的词项。

  • significant terms 对性能的影响可能更大,因为它需要从磁盘读取数据,而不是像 terms 聚合那样从内存中读取。

实际应用(消费者行为分析)
 

为分析准备数据

在本次分析中,我们生成了一个合成的手机销售数据集,包括价格、手机规格、购买者的人口统计信息和反馈。我们还基于用户反馈生成了 embedding,方便后续运行语义查询。我们使用的是 Elasticsearch 中开箱即用的 multilingual e5 small 模型。

在 Elasticsearch 中使用这个数据集的方法如下:

  1. 使用 Kibana 的 Upload data files 功能上传 CSV 文件(可以从此处下载)。

  2. 设置一个名为 “embedding” 的语义字段,使用 multilingual-e5-small 模型,如本博客所示。

  3. 使用默认字段类型完成导入(除 purchase_date 和 user_feedback 外,其它字段为 keyword)。确保设置索引名为 phone_sales_analysis,以便能够直接运行本文展示的查询。

本次分析的主要目标是发现:“What's different about the iPhone 16 buyers versus other segments of the population? - iPhone 16 的购买者与其他人群有何不同?”并以此为基础做市场营销的用户分群。

以下是数据集中的一个示例文档:

{"customer_type": "Returning","user_feedback": "I have to say, quality is great for the price. The battery life is really good.","upgrade_frequency": "2 years","storage_capacity": "256GB","occupation": "Technology & Data","color": "Phantom Black","gender": "Male","price_paid": 899,"previous_brand_loyalty": "Mixed","location_type": "Urban","phone_model": "Samsung Galaxy S24","city_region": "San Francisco Bay Area","@timestamp": "2024-03-15T00:00:00.000-05:00","income_bracket": "75000-100000","purchase_channel": "Online","feedback_sentiment": "positive","education_level": "Bachelor","embedding": "I have to say, quality is great for the price. The battery life is really good.","customer_id": "C001","purchase_date": "2024-03-15","age": 34,"trade_in_model": "iPhone 13"
}

理解人口统计模式

这里,我们将对总体人群进行分析,并将其与 iPhone 16 用户的 significant terms 聚合中的有趣发现进行比较。

常规模式

为了理解常规的购买模式,我们可以在所有文档上对不同字段进行聚合。为简化起见,我们将重点分析购买手机人群的职业。这可以通过向 Elasticsearch 发送请求来完成。

GET phone_sales_analysis/_search
{"aggs": {"occupation_distribution": {"terms": {"size": 5,"field": "occupation"}}},"size": 0
}

这告诉我们,数据集中主要的职业(按记录数量排序)是:

iPhone 16 用户的模式

为了了解购买 iPhone 16 的人群有何不同,我们可以在相同字段上运行一个 terms 聚合,并添加一个过滤器,在查询中筛选出这些人,如下所示:

GET phone_sales_analysis/_search
{"query": {"term": {"phone_model": "iPhone 16"}},"aggs": {"occupation_distribution": {"terms": {"size": 5,"field": "occupation"}}},"size": 0
}

所以,对于 iPhone 16 用户来说,主要的职业是:

我们可以看到,iPhone 16 用户的职业分布模式与其他手机型号的用户不同。让我们用 Kibana 来轻松可视化这些结果:

在这个图表中,我们可以看到 iPhone 16 的趋势与整体人群的趋势不同。

我们可以跳过整个分析,直接运行一个 significant terms 聚合,看看是什么让 iPhone 16 用户与普通人群不同:

GET phone_sales_analysis/_search
{"query": {"term": {"phone_model": "iPhone 16"}},"aggs": {"occupation_distribution": {"significant_terms": {"size": 5,"field": "occupation"}}},"size": 0
}

简而言之,我们得到了这个响应:

Values of occupations for the iPhone 16doc_countbg_count
occupation_distribution (top level)122424
Medical & Healthcare bucket4557

响应清楚地表明,与普通人群相比,iPhone 16 用户中医疗和健康领域的人数异常(即具有显著性!)。让我们看看响应中的数字含义:

  • 顶层
    • doc_count: 122 — 查询总共匹配了 122 个文档
    • bg_count: 424 — 背景集(所有销售文档)包含 424 个文档
  • 在医疗与健康(Medical & Healthcare)桶中:
    • doc_count: 45 — “Medical & Healthcare” 出现在 122 个查询结果中的 45 个
    • bg_count: 57 — “Medical & Healthcare” 出现在背景数据集 424 个文档中的 57 个

在 424 名买家中,有 57 人从事医疗和健康行业,占比 13.44%。但在 iPhone 16 买家中,有 45 人从事该行业,占比 36.88%。这意味着在 iPhone 16 用户中,找到医疗和健康行业从业者的概率是普通人群的两倍!

我们可以用同样的方法分析其它字段(年龄、地点、收入等级等),以发现更多关于 iPhone 16 用户独特之处的信息。

消费者分群

我们可以使用 significant terms 聚合来提取产品、类别和客户分群之间的关联洞察。为此,我们先构建感兴趣类别的父聚合,然后使用 significant terms 和普通 terms 子聚合,找出该类别中有趣的洞察,并与该职业大多数人使用的情况进行比较。

例如,来看一些职业领域的人们偏好什么:

  • 为了让分析更清晰,我们把搜索范围限制在 3 个职业领域:["Administrative & Support", "Technology & Data", "Medical & Healthcare"]
  • 在聚合方面,我们先对职业做 terms 聚合
  • 添加第一个子聚合:按手机型号的 terms 聚合 —— 找出各职业领域用户购买的手机型号
  • 添加第二个子聚合:按手机型号的 significant terms 聚合 —— 找出各职业领域特别偏好的手机型号
GET phone_sales_analysis/_search
{"query": {"terms": {"occupation": ["Administrative & Support","Technology & Data","Medical & Healthcare"]}},"aggs": {"occupations": {"terms": {"size": 15,"field": "occupation"},"aggs": {"general_models": {"terms": {"field": "phone_model"}},"significant_models": {"significant_terms": {"field": "phone_model"}}}}},"size": 0
}

让我们分解聚合结果:

职业:Administrative & Support

Terms 聚合:

Significant terms 聚合:

从这张表中,我们可以推断该职业的趋势与整体人群的趋势没有显著差异。

职业:Technology & Data

Terms 聚合:

Significant terms 聚合

总文档数:424

该职业中的文档数:71

phone modeldoc_count (this model in this occupation)bg_count (this model in all the documents)% in all the documents% in this occupation
Google Pixel 812225.19%16.90%
OnePlus 119143.30%12.68%
OnePlus 12 Pro330.71%4.23%
Google Pixel 8 Pro9214.95%12.68%
Nothing Phone 2581.89%7.04%
Samsung Galaxy Z Fold5461.42%5.63%
OnePlus 128204.72%11.27%

职业:Medical & Healthcare

Terms 聚合:

Significant terms 聚合

总文档数:424

该职业中的文档数:57

phone modeldoc_count (this model in this occupation)bg_count (this model in all the documents)% in all the documents% in this occupation
iPhone 164512228.77%78.95%
iPhone 15 Pro Max3133.07%5.26%
iPhone 157409.43%12.28%

让我们看看这些数据告诉我们什么故事:

  • 医疗和健康专业人士偏爱 iPhone 16,并且总体上非常倾向于使用 Apple 手机。
  • 技术和数据专业人士偏好高端 Android 手机,但不一定使用三星品牌。这个类别中 iPhone 也有较大趋势。
  • 行政和支持类专业人士偏好三星和 Google 手机,但没有明显且独特的趋势。

Significant terms 聚合和混合搜索

混合搜索结合了文本搜索和语义搜索结果,提供更好的搜索体验。在这种情况下, significant terms 聚合可以通过回答 “与所有文档相比,这个数据集有什么特别之处?” 来为上下文感知搜索的结果提供洞察。

为演示此功能,我们来看当用户谈论 “good performance” 时,哪些手机型号出现频率过高:

  • 构建一个语义查询,寻找在 embedding 字段中与输入 “good performance” 最接近的用户反馈

  • 同时在 user_feedback 文本字段上使用相同词项的文本搜索

  • 添加 significant terms 查询,找出这些结果中比整个数据集中更频繁出现的手机型号

GET phone_sales_analysis/_search
{"retriever": {"rrf": {"retrievers": [{"standard": {"query": {"bool": {"must": [{"match": {"user_feedback": {"query": "good performance","operator": "and"}}}]}}}},{"standard": {"query": {"semantic": {"field": "embedding","query": "good performance"}}}}],"rank_window_size": 20}},"aggs": {"Models": {"significant_terms": {"field": "phone_model"}}}
}

让我们来看一个匹配文档的示例:

这是我们得到的响应:

{"took": 388,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0},"hits": {"total": {"value": 20,"relation": "eq"},"max_score": 0.016393442,"hits": [...]},"aggregations": {"Models": {"doc_count": 20,"bg_count": 424,"buckets": [{"key": "iPhone 15","doc_count": 5,"score": 0.4125,"bg_count": 40}]}}
}

这告诉我们,虽然 iPhone 15 在 424 个总文档中出现了 40 次(占 9.4%),但在与语义搜索 “good performance” 匹配的 20 个文档中出现了 5 次(占 25%)。因此我们可以得出结论:在谈论 “good performance” 时,出现 iPhone 15 的概率是随机情况的 2.7 倍。

结论

significant terms 聚合通过将数据集与所有文档进行比较,可以发现数据中的独特细节。这能揭示数据中意想不到的关系,超越简单的出现次数统计。我们可以在多种场景中应用 significant terms,开启非常有趣的功能,例如:

  • 欺诈检测中的模式发现 — 识别被盗信用卡的常见交易。

  • 用户评价中的品牌质量洞察 — 发现收到不成比例差评的品牌。

  • 发现错误分类的文档 — 识别属于某类别(term 过滤器),但描述中使用该类别不常见词汇的文档(significant terms 聚合)。

原文:https://www.elastic.co/search-labs/blog/significant-terms-aggregation-elasticsearch

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/88348.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/88348.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/88348.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pandas.DataFrame中axis参数

明确axis0与axis1的区别和联系, 假设有一个 DataFrame:indexAB012134axis0(沿行方向): 操作会垂直向下进行,对每一列单独处理。 例如:df.sum(axis0) 会对列 A 和列 B 分别求和,结果是…

深度学习 最简单的神经网络 线性回归网络

用最简单的线性模型讲清 神经网络 训练全流程,让你 5 分钟看懂AI 是怎么学会预测的 🔥 1 真实神经元结构 📊 真实神经元包括: 树突 接收其他神经元传来的电信号(输入)。 细胞核 负责整合输入信号并产生动作电位。 轴突 传导动作电位到下一个神经元。 突触 释放神经递质…

k8s Mutating Admission Webhook 实现超卖

目录 1.什么是 Mutating Admission Webhook? 2.如何用 Mutating Admission Webhook 实现超卖? 3.实现超卖 3.1 理解目标 3.2 前置准备 3.3 开发 Mutating Webhook 3.4 配置 Webhook Server TLS 认证 3.5 注册 MutatingWebhookConfiguration 3.6…

为 Go-llm-cpp 接入 Web API 接口,创建 Chatbot 聊天机器人

接续上一篇,用 Go 打造本地 LLM 聊天机器人:整合 llm-go 与 go-llama.cpp,此篇开始建构前端与 API 接口 执行环境需求 • ✅ Go 1.20 • ✅ C toolchain(macOS: Xcode Command Line Tools / Linux: g) • ✅ GGUF 格式…

Docker笔记-Docker Compose

Docker笔记-Docker Compose Compose 是用于定义和运行多容器 Docker 应用程序的工具,通过 Compose 您可以使用 YML 文件来配置应用 程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。 Compose 使用的三个步…

n1 armbian 安装桌面环境并启用xrdp远程登录

armbian-config armbian-software201frpcrootarmbian:~# armbian-software [ STEPS ] Start selecting software [ Current system: ubuntu/noble ]... ──────────────────────────────────────────────────────────…

从传统到智能:地质灾害风险评估、易发性分析与灾后重建;AI大语言模型DeepSeek、ChatGPT、GIS、Python和机器学习深度融合

地质灾害是指全球地壳自然地质演化过程中,由于地球内动力、外动力或者人为地质动力作用下导致的自然地质和人类的自然灾害突发事件。在降水、地震等自然诱因的作用下,地质灾害在全球范围内频繁发生。我国不仅常见滑坡灾害,还包括崩塌、泥石流…

便捷的电脑自动关机辅助工具

软件介绍 本文介绍的软件是一款电脑上实用的倒计时和关机助手。 软件特性 这款关机助手十分贴心,它是一款无需安装的小软件,体积仅60KB,不用担心占用电脑空间,打开即可直接使用。 操作方法 你只需设置好对应的关机时间&#x…

Fiddler-关于抓取Android手机包,安装证书后页面加载失败,提示当前证书不可信存在安全风险的问题

Fiddler-关于抓取Android手机包,安装证书后页面加载失败,提示当前证书不可信存在安全风险的问题Fiddler-关于抓取Android手机包,安装证书后页面加载失败,提示当前证书不可信存在安全风险的问题原因解决方法Fiddler-关于抓取Androi…

Apache Spark 4.0:将大数据分析提升到新的水平

Apache Spark 4.0 带来了 PySpark 画图、多态 UDTF、改进的 SQL 脚本和 Python API 更新,以增强实时分析和可用性。 Apache Spark 4.0 于 2025 年发布,它通过增强性能、可访问性和开发者生产力的创新,重新定义了大数据处理。在 Databricks、A…

手机解压软件 7z:高效便捷的解压缩利器

在当今数字化时代,手机已经成为人们生活和工作中不可或缺的工具。随着文件传输和存储需求的不断增加,7z 文件格式因其高效的压缩比而备受青睐。在手机上处理 7z 文件变得越来越重要,合适的解压软件能带来诸多便利。首先,7z 文件格…

闲庭信步使用图像验证平台加速FPGA的开发:第六课——测试图案的FPGA实现

(本系列只需要modelsim即可完成数字图像的处理,每个工程都搭建了全自动化的仿真环境,只需要双击文件就可以完成整个的仿真,大大降低了初学者的门槛!!!!如需要该系列的工程文件请关注…

Solidity——修改状态变量注意事项和简单优化建议

你的问题非常关键,涉及到 Solidity 合约部署时的初始化 gas 成本 和 运行时的存储操作 gas 消耗。我们来详细解答: 🚨 首先,你的代码是非法的: contract MyContract {uint public myNumber;myNumber 1; // ❌ 不允许…

2023年全国青少年信息素养大赛Python编程小学组复赛真题+答案解析-海南赛区

2023年全国青少年信息素养大赛Python编程小学组复赛真题+答案解析-海南赛区 编程题 第1题 整数加8 题目描述 输入一个整数,输出这个整数加8的结果。 输入描述 输入一行一个正整数。 输出描述 输出求和的结果。 样例1 输入: 5 输出: 13 题目解析 这是最基础的输入输出与…

Qt基本组件详解:按钮、输入框与容器控件

Qt基本组件详解:按钮、输入框与容器控件目录 按钮类组件 QPushButtonQRadioButtonQCheckBox 输入框组件 QLineEditQTextEdit 容器组件 QGroupBox 综合应用示例思维导图总结1. 按钮类组件 1.1 QPushButton(普通按钮) 功能:基础交互…

Unity Universal Render Pipeline/Lit光照材质介绍

文章目录前言参数介绍1、表面选项1.1 Worflow Mode工作流模式1.2 Surface Type 表面类型1.3 Blending Mode 混合模式1.4 Preserve Specular 保留镜面光照(高光)1.5 Render Face 渲染面1.6 Alpha Clipping 透明度剪裁1.7 Receive Shadows 是否接收阴影2、…

uni-app ios离线推送,推送后点击推送的链接进入程序后再次回到桌面,无法消除app的角标问题

问题现象: 解决方案: 1、用h5方法清理 h5地址:HTML5 API Reference 废话不多说上代码 /*** 清除应用角标(支持iOS和Android)* 使用H5方法清理推送角标*/clearAppBadge() {// #ifdef APP-PLUStry {plus.runtime.setBad…

迁移Oracle SH 示例 schema 到 PostgreSQL

接着上一篇文章:迁移Oracle HR 示例 schema 到 PostgreSQL中,本文做Oracle SH(Sales History)示例 schema的迁移,SH schema比HR schema更大更复杂,本次迁移的重点是: 分区表外部数据加载 使用…

1.1 ARMv8/ARMv9安全扩展

目录1.1.1 ARM架构安全演进1.1.2 ARMv8安全特性异常级别(EL)安全模型关键安全扩展1.1.3 ARMv9安全创新机密计算架构(CCA)增强的隔离机制1.1.4 安全扩展的TF-A支持1.1.5 安全扩展配置示例1.1.1 ARM架构安全演进 ARM架构从v7到v9的安全演进路线: ARMv7:引…

更新用户隐私协议后还是 ail api scope is not declared in the privacy agreement怎么办??!

saveImageToPhotosAlbum:fail api scope is not declared in the privacy agreement昨天明明可以了,开了个会出来,又不行了,真要命啊啊啊啊啊啊啊啊啊啊(现在回想起来可能是因为我把发布的那个版本删了,因为那个只是用来测试用的e…