揭示独特模式:Elasticsearch 中 significant terms 聚合指南

作者:来自 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值