问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Elasticsearch新特性:multi_terms聚合技巧大揭秘!

创作时间:
作者:
@小白创作中心

Elasticsearch新特性:multi_terms聚合技巧大揭秘!

引用
CSDN
6
来源
1.
https://blog.csdn.net/qq_29752857/article/details/141176268
2.
https://elastic.ac.cn/guide/en/elasticsearch/reference/current/search-aggregations-bucket-multi-terms-aggregation.html
3.
https://www.elastic.co/guide/en/kibana/current/rule-type-es-query.html
4.
https://elastic.ac.cn/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html
5.
https://www.elastic.co/search-labs/blog/kibana-vega-building-advanced-visualizations
6.
https://opster.com/guides/elasticsearch/data-architecture/elasticsearch-nested-aggregation/

在Elasticsearch 7.12版本中,新增了一个强大的聚合功能——multi_terms聚合。这个功能允许用户通过多个字段进行数据聚合,为复杂的数据分析提供了新的解决方案。本文将详细介绍multi_terms聚合的使用方法和应用场景,帮助读者更好地理解和使用这个新特性。

01

什么是multi_terms聚合?

multi_terms聚合是一种基于多桶值源的聚合,其中桶是动态构建的——每个唯一的数值集对应一个桶。它与terms聚合非常相似,但在大多数情况下,它会比terms聚合慢,并且会消耗更多的内存。因此,如果始终使用相同的字段集,则将此字段的组合键索引为单独的字段,并在该字段上使用terms聚合会更有效。

当需要按复合键上的文档数量或指标聚合进行排序并获得前N个结果时,multi_terms聚合是最有用的。如果不需要排序,并且期望使用嵌套terms聚合或复合聚合检索所有值,则会是一种更快、更节省内存的解决方案。

02

使用方法

multi_terms聚合的使用方法与terms聚合类似,但需要指定多个字段。以下是一个基本的DSL示例:

GET /products/_search
{
  "aggs": {
    "genres_and_products": {
      "multi_terms": {
        "terms": [
          {
            "field": "genre"
          },
          {
            "field": "product"
          }
        ]
      }
    }
  }
}

这个查询将根据genre和product两个字段的组合值进行聚合,返回每个组合的文档数量。

关键参数说明

  • size:可选参数,定义应从整个term列表中返回多少个term桶。默认为10。
  • shard_size:可选参数,请求的size越大,结果越准确,但计算最终结果的成本也越高。默认的shard_size是(size * 1.5 + 10)。
  • show_term_doc_count_error:可选参数,计算每个term的文档计数误差。默认为false。
  • order:可选参数,指定桶的顺序。默认为每个桶的文档数。对于文档计数相同的桶,使用桶term值作为平局决胜值。
  • min_doc_count:可选参数,要返回的桶中,文档的最小数量。默认为1。
  • shard_min_doc_count:可选参数,要返回的每个分片上的桶中,文档的最小数量。默认为min_doc_count。
  • collect_mode:可选参数,指定数据收集的策略。支持depth_first或breadth_first模式。默认为breadth_first。

使用脚本生成term

multi_terms聚合还支持使用脚本生成term,这为数据处理提供了更大的灵活性。例如:

GET /products/_search
{
  "runtime_mappings": {
    "genre.length": {
      "type": "long",
      "script": "emit(doc['genre'].value.length())"
    }
  },
  "aggs": {
    "genres_and_products": {
      "multi_terms": {
        "terms": [
          {
            "field": "genre.length"
          },
          {
            "field": "product"
          }
        ]
      }
    }
  }
}

这个查询将根据genre字段的长度和product字段的组合值进行聚合。

03

实际应用场景

multi_terms聚合在实际项目中有着广泛的应用,特别是在监控和告警系统中。例如,可以使用multi_terms聚合来创建Elasticsearch查询规则,通过设置阈值和时间窗口来触发警报。

以下是一个使用multi_terms聚合的Elasticsearch查询规则示例:

{
  "query": {
    "bool": {
      "must": [
        {
          "query_string": {
            "query": "http.response.status_code: 500"
          }
        }
      ]
    }
  },
  "aggs": {
    "error_analysis": {
      "multi_terms": {
        "terms": [
          {
            "field": "http.request.method"
          },
          {
            "field": "http.request.path"
          }
        ]
      }
    }
  }
}

这个查询将分析所有500错误响应的请求,按请求方法和请求路径进行聚合,帮助开发人员快速定位问题。

04

性能考虑

虽然multi_terms聚合功能强大,但其性能特点也需要特别注意:

  1. 内存消耗:multi_terms聚合会消耗更多内存,特别是在处理大量唯一term时。
  2. 速度:通常比terms聚合慢,因此在不需要排序的情况下,建议使用嵌套terms聚合或复合聚合。
  3. 优化建议
    • 如果始终使用相同的字段集,建议将组合键索引为单独的字段,并在该字段上使用terms聚合。
    • 通过设置合理的size和shard_size参数来平衡准确性和性能。
    • 在不需要排序时,考虑使用其他聚合方式。

multi_terms聚合为Elasticsearch的数据分析能力带来了新的可能性。通过合理使用这个功能,可以更方便地实现复杂的数据聚合需求,特别是在需要按多个字段进行排序和筛选的场景中。然而,由于其性能特点,在使用时也需要权衡资源消耗和查询效率,选择最适合的聚合方式。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号