博客

揭开独特模式的面纱:Elasticsearch 中重要术语聚合指南

了解如何使用重要术语聚合来发现数据中的洞察力。

在 Elasticsearch 中,重要术语聚合超出了最常见术语的范围,可在数据集中找到统计上不寻常的值。这使我们能够发现有价值的见解和非显而易见的模式。一个重要的术语集合提供了两个有用参数的响应:

  • bg_count(背景计数): 在父数据集中找到的文件数

  • doc_count:结果数据集中找到的文件数

例如,在手机销售数据集中,我们可以像这样查找 iPhone 16 销售的重要术语:

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
       }

     ]
   }
 }
}

在整个数据集中,休斯顿既不是排名前十的城市,也不是 iPhone 16 的热门城市。不过,重要术语汇总显示,与其他数据相比, 该城市购买 iPhone 16 的比例过高。让我们深入了解这些数字:

  • 在最高层:

    • doc_count:122 - 查询总共匹配了 122 份文件

    • bg_count:424 - 背景集(所有销售文件)包含 424 份文件

  • 在休斯顿的水桶里:

    • doc_count:12 - 休斯顿出现在 122 条查询结果中的 12 条中

    • bg_count:14 - 在背景数据集的 424 份文件中,休斯顿出现在 14 份文件中

这告诉我们,在 424 次总购物中,只有 14 次发生在休斯顿,占总购物次数的 3.3% 。然而,如果我们只看 iPhone 16 的销售情况,就会发现 122 件中有 12 件发生在休斯顿,比整个数据集多 3 倍,即 9.8% ;这是非常重要的!

以下是可视化效果图:每个城市/地区的销售总额。

我们可以看到,休斯顿有 14 笔销售,是数据集中销售额第 14 高的城市。

现在,如果我们只对 iPhone 16 的销售情况进行筛选,休斯顿就有 12 台,成为该机型销售量第二大的城市:

了解重要术语汇总

根据 Elastic 文档,重要的术语是聚合

"(查找)在前景集和背景集之间流行度发生显著变化的术语"。

这意味着它使用统计指标,将数据子集(前景集)中某个术语的频率与父数据集(背景集)中同一术语的频率进行比较。这样,评分反映的是统计意义,而不是术语在数据中出现的频率。

重要术语聚合与普通术语聚合的主要区别在于

  • 重要术语对数据的子集进行比较,而术语聚合只对查询产生的数据集起作用。

  • 术语聚合的结果是数据集中最常见的术语,而重要术语的结果则忽略了常见术语,以找出数据集的独特之处。

  • 重要术语对性能的影响更大,因为它需要从磁盘而不是内存中获取数据,就像术语聚合所做的那样。

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

为分析准备数据

为了进行分析,我们生成了一个合成的手机销售数据集,其中包括价格、手机规格、购买者的人口统计数据和反馈信息。我们还根据用户的反馈生成了嵌入信息,以便日后进行语义查询。我们使用了 Elasticsearch 上开箱即用的多语言 e5 小型模型

要在 Elasticsearch 上使用此数据集:

  1. 使用 Kibana 上传数据文件 功能上传 CSV 文件(可从 此处 下载)。

  2. 如本博客所示,设置一个名为 "嵌入 "的语义字段,使用 multilingual-e5-small model

  3. 使用字段类型默认值完成导入(除purchase_dateuser_feedback) 外,每个字段都使用关键字。请确保添加索引名称phone_sales_analysis ,以便能够按原样运行此处提供的查询。

这项分析的主要重点是发现"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 用户重要术语汇总的有趣发现进行比较。

正常模式

为了了解正常的购买模式,我们可以汇总不同领域所有文档的数据。为简单起见,我们将重点探讨购买手机的人的职业。我们可以通过向 Elasticsearch 提出请求来实现这一点。

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

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

iPhone 16 用户的使用模式

为了了解购买了 iPhone 16 的人有什么不同,让我们在同一字段上运行术语聚合,并在查询中使用过滤器找到这些人,就像这样:

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 的趋势与整个人群的趋势不同。

我们可以跳过整个分析,通过一个重要项的汇总,来看看 iPhone 16 用户与普通用户的不同之处:

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

简而言之,我们得到了这样的答复:

iPhone 16 的职业值

文件数量

bg_count

职业分布(最高级别)

122

424

医疗& 保健桶

45

57

这些回复清楚地表明,iPhone 16 用户有一个不常见的(读作 "重要!")问题。与普通人相比,医疗& 保健领域的人数更多。让我们看看回复中的数字意味着什么:

  • 在最高层:

    • doc_count:122 - 查询总共匹配了 122 份文件

    • bg_count:424 - 背景集(所有销售文件)包含 424 份文件

  • 在医疗& 保健桶中:

    • doc_count:45 - "医疗& 保健" 在 122 条查询结果中出现了 45 条

    • bg_count:57 - "医疗& 保健" 在背景数据集中的全部 424 份文件中出现 57 份

在 424 位买家中,有 57 位在医疗& 保健领域工作,即 13.44% 。但是,当我们查看 iPhone 16 的购买者时,122 位购买者中有 45 位从事医疗& ,即 36.88% 。这意味着在 iPhone 16 用户中,从事医疗& 保健工作的可能性要高出一倍!

我们可以将同样的分析应用于其他领域(年龄、地点、收入阶层等),从而发现更多有关 iPhone 16 用户独特之处的信息。

消费者细分

我们可以利用重要术语聚合来提取产品、类别和客户群之间的关系洞察。为此,我们为感兴趣的类别建立一个父聚合。我们还使用了重要术语和普通术语子分类,以发现对该类别的有趣见解,并将其与该职业中大多数人使用的术语进行比较。

例如,让我们看看某些工作领域的人喜欢什么:

  1. 为了更清楚地进行分析,我们将搜索范围限制在 3 个工作领域:["行政& 支持","技术& 数据","医疗& 保健"]

  2. 在汇总方面,我们首先按职业进行术语汇总

  3. 增加一个子分类:按手机型号分类--查找在各个领域工作的用户正在购买哪些手机型号

  4. 添加第二个子分类:按手机型号分类的重要术语,以找出每个工作领域中的特殊型号

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
}

让我们来分析一下汇总结果:

职业行政& 支持

术语汇总

重要术语汇总

从该表中我们可以推断出,该职业的趋势与整个人口的趋势之间没有显著差异

职业:技术& 数据

术语汇总

重要术语汇总

文件总数424

该职业的文件:71

手机型号

doc_count (本职业中的本模型)

bg_count (所有文件中都有此模型)

% 在所有文件中

% 从事这一职业

谷歌 Pixel 8

12

220

5.19%

16.90%

OnePlus 11

9

14

3.30%

12.68%

OnePlus 12 Pro

3

3

0.71%

4.23%

谷歌 Pixel 8 Pro

9

21

4.95%

12.68%

无手机 2

5

8

1.89%

7.04%

三星 Galaxy Z Fold5

4

6

1.42%

5.63%

OnePlus 12

8

20

4.72%

11.27%

职业:医疗& 保健

术语汇总

重要术语汇总

文件总数424

该职业的文件:57

手机型号

doc_count (本职业中的本模型)

bg_count (所有文件中都有此模型)

% 在所有文件中

% 从事这一职业

iPhone 16

45

122

28.77%

78.95%

iPhone 15 Pro Max

3

13

3.07%

5.26%

iPhone 15

7

40

9.43%

12.28%

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

  • 医疗& 医疗保健专业人士更喜欢 iPhone 16,而且普遍倾向于使用苹果手机。

  • 技术& 数据专业人士更喜欢高端安卓手机,但不一定使用三星品牌。在这一类别中,iPhone 也有相当大的发展趋势。

  • 行政管理& 支持专业人员更喜欢三星和谷歌手机,但没有形成强烈而独特的趋势。

重要术语汇总和混合搜索

混合搜索结合了文本搜索和语义结果,可提供更好的搜索体验。在这种情况下,一个重要的术语聚合可以通过回答问题来深入了解上下文感知搜索的结果:与所有文档相比,这个数据集有什么特别之处?为了展示这一特点,让我们看看当用户谈论良好性能时,哪些模型的代表性过高:

  • 让我们建立一个语义查询,通过字段嵌入找到最接近输入 "性能良好 "的用户反馈

  • 我们还将在文本字段 user_feedback 中使用相同的术语进行文本搜索

  • 我们还将添加一个重要术语查询,以找到在这些结果中出现频率高于完整数据集的手机型号

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% ),但在符合语义搜索 "良好表现 "的 20 篇文档(占文档总数的 25% )中却能找到 5 次。因此,我们可以得出这样的结论:在谈论良好性能时,发现 iPhone 15 的可能性是偶然发现的 2.7 倍。

结论

重要术语聚合可以通过将数据集与全局文档进行比较,发现数据集的独特细节。这可以揭示数据中意想不到的关系,而不仅仅是出现次数的计算。例如,我们可以在各种使用案例中应用重要术语,从而实现非常有趣的功能:

相关内容

如何在不同版本的 Elasticsearch& 集群之间迁移数据

Kofi Bartlett

介绍 Kibana 中的 Elasticsearch 查询规则用户界面

Jhon Guzmán

正确使用 JavaScript 的 Elasticsearch,第二部分

Jeffrey Rengifo

语义搜索的实现:使用 Elasticsearch 构建食谱搜索

Andre Luiz

如何在 AWS Marketplace 上部署 Elasticsearch

Eduard Martin

准备好打造最先进的搜索体验了吗?

足够先进的搜索不是一个人的努力就能实现的。Elasticsearch 由数据科学家、ML 操作员、工程师以及更多和您一样对搜索充满热情的人提供支持。让我们联系起来,共同打造神奇的搜索体验,让您获得想要的结果。

亲自试用