首页 > 其他分享 >Elasticsearch如何聚合查询多个统计值,如何嵌套聚合?并相互引用,统计索引中某一个字段的空值率?语法是怎么样的?

Elasticsearch如何聚合查询多个统计值,如何嵌套聚合?并相互引用,统计索引中某一个字段的空值率?语法是怎么样的?

时间:2024-06-19 18:22:13浏览次数:11  
标签:count 聚合 field 字段 Elasticsearch 文档 my

目录

Elasticsearch聚合查询说明

Elasticsearch聚合查询是一种强大的工具,允许我们对索引中的数据进行复杂的统计分析和计算。本文将详细解释一个聚合查询示例,该查询用于统计满足特定条件的文档数量,并计算其占总文档数量的百分比。这里回会分享如何统计某个字段的空值率,然后扩展介绍ES的一些基础知识。

空值率查询DSL

此查询结构通过 GET /my_index/_search 发送到 Elasticsearch,以实现对索引 my_index 的聚合分析。查询分为以下几个部分:

{
  "size": 0, // 不返回任何搜索结果,只聚合数据
  "aggs": {
    "all_documents_agg": { // 聚合所有文档
      "terms": {
        "script": {
          "source": "return 'all_documents';" // 强制所有文档聚合到一个桶中
        }
      },
      "aggs": {
        "total_count": { // 统计所有文档的数量
          "value_count": {
            "field": "_id" // 使用文档的ID字段进行计数
          }
        },
        "filtered_count": { // 统计满足特定条件的文档数量
          "value_count": {
            "script": {
              "source": "if (doc['my_field'].size() != 0 && doc['my_field'].value != '') return 1" // 统计字段 'my_field' 非空且非零的文档数量
            }
          }
        },
        "percentage_agg": { // 计算满足特定条件的文档数量占总文档数量的百分比
          "bucket_script": {
            "buckets_path": {
              "totalCount": "total_count", // 引用所有文档的数量
              "filteredCount": "filtered_count" // 引用满足特定条件的文档数量
            },
            "script": "params.filteredCount / params.totalCount * 100" // 计算百分比
          }
        }
      }
    }
  }
}

聚合部分详解

  • size: 0:此设置意味着查询不会返回具体的搜索结果,而是仅执行聚合分析。
  • aggs(聚合):定义了一个名为 all_documents_agg 的聚合。
    • terms:使用 script 将所有文档强制聚合到一个名为 all_documents 的桶中。
    • aggs:在 all_documents 桶内,定义了三个子聚合:
      1. total_count:使用 value_count 统计所有文档的数量,基于文档的 _id 字段。
      2. filtered_count:使用 value_count 统计满足特定条件的文档数量。条件是字段 my_field 非空且非零。
      3. percentage_agg:使用 bucket_script 计算满足特定条件的文档数量占总文档数量的百分比。此聚合使用 total_count 和 filtered_count 的结果,并通过 params.filteredCount / params.totalCount * 100 计算百分比。

Elasticsearch聚合基础知识扩展

Elasticsearch聚合概念

Elasticsearch 的聚合功能类似于 SQL 中的 GROUP BY 语句,允许我们对数据进行分组和计算统计信息。聚合主要分为以下几类:

  • Metric Aggregations(度量聚合):计算数值,例如计数、平均值、最大值、最小值等。例如,value_count 就是一个度量聚合,用于计算特定字段的值的数量。
  • Bucket Aggregations(桶聚合):将文档分组到不同的桶中。每个桶都可以包含一个或多个文档。例如,terms 聚合将文档根据特定字段的值进行分组。
  • Pipeline Aggregations(管道聚合):对其它聚合的结果进行进一步计算。例如,bucket_script 可以对多个聚合结果进行自定义计算。

Script 用法

在 Elasticsearch 中,脚本可以用于在查询和聚合中执行动态计算。在上述查询中,脚本用于两个地方:

  • terms 聚合中的 script:将所有文档强制聚合到一个桶中。
  • filtered_count 的条件判断:检查字段 my_field 是否非空且非零。
  • bucket_script 聚合:计算满足条件的文档数量占总文档数量的百分比。

使用脚本可以提供更大的灵活性,但需要注意性能和安全性问题。

Elasticsearch聚合查询语法

Elasticsearch(ES)提供了丰富的聚合功能,用于对数据进行统计和分析。以下是一些常见的聚合类型及其示例:

指标聚合(Metric Aggregations)

  • sum:计算数值字段的总和。
  • avg:计算数值字段的平均值。
  • min:查找数值字段的最小值。
  • max:查找数值字段的最大值。
  • extended_stats:获取数值字段的多个统计数据(平均值、最大值、最小值、总和、方差等)。
  • value_count:计算字段的非空值数量。

示例:

{
  "aggs": {
    "my_sum_agg": {
      "sum": {
        "field": "numeric_field"
      }
    },
    "my_avg_agg": {
      "avg": {
        "field": "numeric_field"
      }
    }
  }
}

桶聚合(Bucket Aggregations)

  • date_histogram:基于时间范围将文档分组为多个桶。
  • histogram:基于数值字段将文档分组为多个桶。
  • terms:基于字符串或数值字段将文档分组为多个桶。
  • filters:将文档分组为多个桶,每个桶对应一组过滤条件。

示例:


{
  "aggs": {
    "my_date_histogram_agg": {
      "date_histogram": {
        "field": "timestamp",
        "interval": "1d"
      }
    },
    "my_terms_agg": {
      "terms": {
        "field": "category_field"
      }
    }
  }
}

矩阵聚合(Matrix Aggregations)

  • matrix_stats:计算多个数值字段的统计数据(如相关性、协方差、方差等)。

示例:

{
  "aggs": {
    "my_matrix_stats_agg": {
      "matrix_stats": {
        "fields": ["numeric_field1", "numeric_field2"]
      }
    }
  }
}

组合聚合(Pipeline Aggregations)

  • derivative:计算聚合结果的导数。
  • cumulative_sum:计算聚合结果的累积和。
  • bucket_script:在多个桶聚合结果上执行脚本。
  • bucket_selector:根据脚本选择或排除特定桶。

示例:

{
  "aggs": {
    "my_terms_agg": {
      "terms": {
        "field": "category_field"
      },
      "aggs": {
        "my_avg_agg": {
          "avg": {
            "field": "numeric_field"
          }
        },
        "my_bucket_script_agg": {
          "bucket_script": {
            "buckets_path": {
              "avgField": "my_avg_agg"
            },
            "script": "params.avgField * 2"
          }
        }
      }
    }
  }
}

原文地址:Elasticsearch如何聚合查询多个统计值,如何嵌套聚合?并相互引用,统计索引中某一个字段的空值率?语法是怎么样的

标签:count,聚合,field,字段,Elasticsearch,文档,my
From: https://www.cnblogs.com/the-pig-of-zf/p/18256995

相关文章

  • Elasticsearch 的事务日志
    translog是Elasticsearch保证数据可靠性和灾难恢复的重要组件,每个索引分片配备一个translog,对索引数据的增加、更新操作都会记录在translog中。translog本质上是一个可滚动的日志文件,相比于lucene的写入,日志文件的写入是一个相对轻量的操作,translog会定期地sync到磁......
  • 多租户的后台管理系统框架涉及到在不同租户之间隔离数据(字段隔离)------------升鲜宝供
    在多租户系统中,为了区分平台级用户和租户级用户,我们通常会使用一个特定的租户ID来表示平台级用户和角色。这种设计确保了平台级用户和角色能够被正确识别和管理,而不会与任何具体租户的用户和角色混淆。###设计方案1.**特定租户ID**:使用一个特定的租户ID(例如,`0`或`1`)来表......
  • Net6 EFCore 基于MSSQL & T4 自动生成字段注释
    文件模板代码<#@templatelanguage="C#"#><#@outputextension=".cs"#><#@assemblyname="System.Core"#><#@importnamespace="System.IO"#><#@importnamespace="System.Linq"#>......
  • (亲测有效)推荐2024最新的免费漫画软件app,无广告,聚合全网资源!
    朋友们,阿星又来啦!今天,我要给你们带来一些低调但超级实用的APP推荐,让你们追书看漫画,从此不再书荒!追书大全:这个APP,简直是书迷的救星!不用花一分钱,就能畅游在数百万本小说的海洋里,轻松找到你的最爱。追书大全不仅支持漫画和小说,还能让你在阅读的时候远离广告和弹窗的干扰,让你完......
  • Elasticsearch 近实时搜索的底层原理
    我们都知道Elasticsearch的搜索是近实时的,数据写入后,立即搜索(不通过id)文档是搜不到的。这一切的原因要归于lucene所提供的API,因为lucene的API就是非实时的,Elasticsearch在lucene之上盖房子,通过一些增强,实现了查询的近实时和id查询的实时性。本文就来看看这个近实时......
  • 5、docker-部署ES(elasticsearch)+kibana
    #es暴露的端口多#es十分消耗内存#es的数据一般需要放置到安全目录、挂载=========================================安装es=========================1、下载启动es(建议启动前把其它容器停止,不然会很卡)·dockerrun-d--nameelasticsearch-p9200:9200-p9300:9300......
  • SIL-PEG-AA,Silane-PEG-Acetic Acid可制备高分子聚合物和有机硅材料
    【试剂详情】英文名称Silane-PEG-AA,SIL-PEG-AA,Silane-PEG-AceticAcid,SIL-PEG-AceticAcid中文名称三乙氧基硅烷聚乙二醇乙酸,三乙氧基硅烷PEG乙酸外观性状由分子量决定,固体或者液体。分子量0.4k,0.6k,1k,2k,3.4k,5k,10k(可定制)溶解性溶于水,溶于DMF、DMSO等部分有......
  • Dynamics CRM 365 使用 FetchXml 聚合数据(Aggregate data using FetchXml)
    前言FetchXML包括分组和聚合功能,可用于计算多行数据的总和、平均值、最小值、最大值和计数。若要返回聚合值,必须:将aggregate设置为true。为每个属性元素设置别名alias属性。将每个属性元素的aggregate属性设置为以下聚合函数之一:函数返回值avg包含数据的......
  • 删除多个文件名中相同的指定字段
    删除多个文件名中相同的指定字段删除"HC1201150"字段:importosdefdelete_files_with_string(directory,substring):forroot,_,filesinos.walk(directory):forfileinfiles:ifsubstringinfile:full_path=os.path.......
  • 微服务开发与实战Day09 - Elasticsearch
    一、DSL查询Elasticsearch提供了DSL(DomainSpecificLanguage)查询,就是以JSON格式来定义查询条件。类似这样:DSL查询可以分为两大类:叶子查询(Leafqueryclauses):一般是在特定的字段里查询特定值,属于简单查询,很少单独使用。复合查询(Compoundqueryclauses):以逻辑方式组合多个叶......