当前位置: 首页 > 工具软件 > Elastic-Bg > 使用案例 >

Elasticsearch 7.X-8.0 AggregationBuliders 相关聚合函数(二)桶聚合-词频分析

柴声
2023-12-01
  • signficantTerms 显著关键词聚合

    • 应用于 keyword 字段
    • 应用场景:
      • 识别与用户查询相关的相关术语/文档。 例如,当用户想要查询“禽流感”相关消息时,聚合可能会建议诸如“H5N1”之类的术语。
      • Significant term聚合可用于自动新闻分类器,其中基于频繁连接的术语图对文档进行分类。
      • 发现数据中的异常。 例如,借助这种汇总,我们可以识别某些地理区域中的异常犯罪类型或疾病。
    • ‎在所有这些情况下,所选择的术语不仅仅是集合中最受欢迎的术语。它们是在‎‎前景‎‎集和‎‎背景‎‎集之间测量的受欢迎程度发生重大变化的术语。如果术语"H5N1"仅存在于1000万个文档索引中的5个文档中,但在构成用户搜索结果的100个文档中的4个文档中找到,则该文档非常重要并且可能与他们的搜索非常相关。5/10,000,000 与 4/100 的频率有很大的波动。‎

    • 请求示例:

    • GET /_search
      {
        "query": {
          "terms": { "force": [ "British Transport Police" ] }
        },
        "aggregations": {
          "significant_crime_types": {
            "significant_terms": { "field": "crime_type" }
          }
        }
      }

      搜索英国交通警察中的相关犯罪类型;

    • 返回:

    • {
        ...
        "aggregations": {
          "significant_crime_types": {
            "doc_count": 47347,
            "bg_count": 5064554,
            "buckets": [
              {
                "key": "Bicycle theft",
                "doc_count": 3640,
                "score": 0.371235374214817,
                "bg_count": 66799
              }
                    ...
            ]
          }
        }
      }

      其中自行车盗窃最频繁;

    • 注意到此聚合有如下限制

      • ‎与terms聚合不同,目前无法使用脚本生成的术语进行计数。由于significant_terms聚合必须同时考虑‎‎前台‎‎和‎‎背景‎‎频率,因此在整个索引上使用脚本来获取背景频率进行比较的成本高得令人望而却步。此外,由于类似的原因,不支持将 DocValues 作为术语数据源。‎‎

      • 目前不支持将浮点域作为significant_terms分析的主题。虽然整数或长字段可用于表示银行帐号或类别号等概念,这些概念可能很有趣,但浮点字段通常用于表示某些内容的数量。因此,单个浮点项对于这种形式的频率分析没有用处。‎

      • ‎如果存在查询等效项或没有提供索引子集的查询条件,则不应将significant_terms聚合用作最顶层的聚合 - 在这种情况下‎‎,前台‎‎集与‎‎背景‎‎集完全相同,因此在要观察的文档频率和从中提出合理建议的频率没有差异。‎

  • significantText 显著文本聚合

    • 应用于 text 文本字段
    • 不需要doc-values或field data
    • 它可以动态地重新分析文本,意味着聚合还可以过滤重复的有噪声的文本,否则这些文本可能会歪曲统计数据。
    • significant terms 聚集类似,significant text 聚集在前端数据集和后端数据集上执行词频统计分析
    • 应用场景:
      • ‎当用户搜索"禽流感"时建议使用"H5N1"以帮助扩展查询‎
      • ‎建议与股票代码相关的关键字$ATI,以便在自动新闻分类器中使用‎
    • 请求示例:
    • GET news/_search
      {
        "query": {
          "match": { "content": "Bird flu" }
        },
        "aggregations": {
          "my_sample": {
            "sampler": {
              "shard_size": 100
            },
            "aggregations": {
              "keywords": {
                "significant_text": { "field": "content" }
              }
            }
          }
        }
      }

      在新闻文档中搜索含有禽流感的内容,并将结果中的content字段内容进行词频分析

    • 返回示例:

    • {
        "took": 9,
        "timed_out": false,
        "_shards": ...,
        "hits": ...,
          "aggregations" : {
              "my_sample": {
                  "doc_count": 100,
                  "keywords" : {
                      "doc_count": 100,
                      "buckets" : [
                          {
                              "key": "h5n1",
                              "doc_count": 4,
                              "score": 4.71235374214817,
                              "bg_count": 5
                          }
                          ...
                      ]
                  }
              }
          }
      }

      ‎结果表明,"h5n1"是与禽流感密切相关的几个术语之一。它在整个索引中只出现了5次(bg_count=5),但其中4次(doc_count=4)幸运地出现在我们的100个"禽流感"结果文件样本中。这表明了一个重要的单词,用户可以将其添加到他们的搜索中。

    • bg_count 当下文档总个数

    • doc_count 搜索结果集中出现的个数

    • 限制

      • 此聚合下,不支持子聚合

        • ‎它将带来高昂的内存成本‎
        • ‎它不是一个通常有用的功能,对于那些需要它的人来说,有一个解决方法。‎
      • 不支持nested 嵌套对象
        • ‎significant_text聚合当前也无法与嵌套对象中的文本字段一起使用,因为它适用于文档 JSON 源。这使得在给定匹配的Lucene docID的情况下从存储的JSON中匹配嵌套文档时,此功能效率低下。‎
    • 更多详细介绍:官网
  • composite 复合聚合

    • ‎复合聚合的开销很大。在生产中部署复合聚合之前,对应用程序进行负载测试。‎
    • ‎与其他聚合不同,您可以使用聚合有效地对多级聚合‎‎中的所有‎‎存储桶进行分页。此聚合提供了一种流式传输特定聚合‎‎的所有‎‎存储桶的方法,类似于‎‎滚动‎‎对文档执行的操作。‎multi-bucketcomposite

      ‎复合存储桶是根据为每个文档提取/创建的值的组合构建的,并且每个组合都被视为复合存储桶。‎

    • 参数支持:

 类似资料: