Elasticsearch中nested聚合操作

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 在Elasticsearch实战场景中,我们或多或少会遇到嵌套文档的组合形式,反映在ES中称为父子文档。父子文档的实现,至少包含以下两种方式:1)父子文档2)Nested嵌套类型

ElasticSearch简介(也称ES)

Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene(TM) 基础上的搜索引擎.当然 Elasticsearch 并不仅仅是 Lucene 那么简单,它不仅包括了全文搜索功能,还可以进行以下工作:

  • 分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索。
  • 实时分析的分布式搜索引擎。
  • 可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。

ElasticSearch数据类型

一级分类 二级分类 具体类型
基础类型 字符串类型 string,text,keyword
-- 整数类型 integer,long,short,byte
-- 逻辑类型 boolean
-- 浮点类型 double,float,half_float,scaled_float
-- 日期类型 date
-- 范围类型 range
-- 二进制类型 binary
复合类型 数组类型 array
-- 对象类型 object
-- 嵌套类型 nested
地理类型 地理坐标类型 geo_point
-- 地理地图 geo_shape
特殊类型 IP类型 ip
-- 范围地图 completion
-- 令牌计数类型 token_count
-- 附件地图 attachment
-- 抽取类型 percolator

以上便是ES中的数据类型,下面便对其中的object和nested来做一个简单的介绍。

nested介绍

nested就是一个嵌套对象,是object数据类型的特殊版本,它允许对象数组相互独立地进行索引和查询,使用时和其他类型使用基本相同,下面便是我来举的一个例子,labels便是一个nested类型的数据

{
  "settings": {
    "index": {
      "codec": "best_compression",
      "mapping": {
        "nested_fields": {
          "limit": "2000"
        },
        "total_fields": {
          "limit": "10000"
        }
      },
      "refresh_interval": "1s",
      "number_of_shards": "2",
      "translog": {
        "flush_threshold_size": "1gb",
        "sync_interval": "30s",
        "durability": "async"
      },
      "number_of_replicas": "1"
    }
  },
  "mappings": {
    "dynamic": true,
    "properties": {
      "id": {
        "type": "long",
        "doc_values": false,
        "index": false
      },
      "name": {
        "type": "text",
        "analyzer": "ik_max_word",
        "search_analyzer": "ik_smart"
      },
      "provinces": {
        "type": "keyword",
        "doc_values": false
      },
      "city": {
        "type": "keyword"
      },
      "permissionLevel": {
        "type": "integer",
        "doc_values": false,
        "index": false
      },
      "status": {
        "type": "integer"
      },
      "labels": {
        "type": "nested",
        "properties": {
          "label": {
            "type": "keyword"
          },
          "classification": {
            "type": "keyword"
          }
        }
      }
    }
  }
}

当需要使用这个嵌套类型中的数据进行过滤,统计时我们普遍会使用这个来做一个聚合查询,但是这个会出现一个问题,那便是,所聚合出来的数据只是nested对象的数据,而外部主体数据并没有聚合出来那便是一个问题

{
  "size": 0,
  "query": {
    "bool": {
      "must": [
        {
          "nested": {
            "path": "labels",
            "query": {
              "term": {
                "labels.classification": "行业"
              }
            }
          }
        }
      ]
    }
  },
  "aggs": {
    "genres": {
      "nested": {
        "path": "labels"
      },
      "aggs": {
        "label_agg": {
          "terms": {
            "field": "labels.label"
          },
          "aggs": {
            "count_sub": {
              "sum": {
                "field": "viewCpount"
              }
            }
          }
        },
        "fll": {
          "filter": {
            "term": {
              "labels.classification": "行业"
            }
          },
          "aggs": {
            "label_agg2": {
              "terms": {
                "field": "labels.label"
              }
            }
          }
        }
      }
    }
  }
}

之后,通过对官网文档,还有同事的讨论,当对nested对象使用聚合查询时,便需要时用reverse_nested,来回到root主体。这样便能够对nested之外的数据来进行聚合操作了。


{
  "size": 0,
  "query": {
    "bool": {
      "must": [
        {
          "nested": {
            "path": "labels",
            "query": {
              "term": {
                "labels.classification": "c1"
              }
            }
          }
        }
      ]
    }
  },
  "aggs": {
    "genres": {
      "nested": {
        "path": "labels"
      },
      "aggs": {
        "fll": {
          "filter": {
            "term": {
              "labels.classification": "c1"
            }
          },
          "aggs": {
            "label_agg2": {
              "terms": {
                "field": "labels.label"
              },
              "aggs": {
                "res": {
                  "reverse_nested": {},
                  "aggs": {
                    "count_view": {
                      "sum": {
                        "field": "viewCount"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
1月前
|
存储 SQL 监控
|
3月前
|
存储 自然语言处理 关系型数据库
ElasticSearch基础3——聚合、补全、集群。黑马旅游检索高亮+自定义分词器+自动补全+前后端消息同步
聚合、补全、RabbitMQ消息同步、集群、脑裂问题、集群分布式存储、黑马旅游实现过滤和搜索补全功能
ElasticSearch基础3——聚合、补全、集群。黑马旅游检索高亮+自定义分词器+自动补全+前后端消息同步
|
4月前
|
自然语言处理 Java 关系型数据库
ElasticSearch 实现分词全文检索 - 聚合查询 cardinality
ElasticSearch 实现分词全文检索 - 聚合查询 cardinality
153 1
|
6月前
|
SQL 安全 数据挖掘
Elasticsearch如何聚合查询多个统计值,如何嵌套聚合?并相互引用,统计索引中某一个字段的空值率?语法是怎么样的?
Elasticsearch聚合查询用于复杂数据分析,包括统计空值率。示例展示了如何计算字段`my_field`非空非零文档的百分比。查询分为三步:总文档数计数、符合条件文档数计数及计算百分比。聚合概念涵盖度量、桶和管道聚合。脚本在聚合中用于动态计算。常见聚合类型如`sum`、`avg`、`date_histogram`等。组合使用可实现多值统计、嵌套聚合和空值率计算。[阅读更多](https://zhangfeidezhu.com/?p=515)
312 0
Elasticsearch如何聚合查询多个统计值,如何嵌套聚合?并相互引用,统计索引中某一个字段的空值率?语法是怎么样的?
|
6月前
|
JSON DataWorks 关系型数据库
DataWorks操作报错合集之同步Elasticsearch数据报错:Cat response did not contain a JSON Array,是什么导致的
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
5月前
|
监控 搜索推荐 Go
万字详解!在 Go 语言中操作 ElasticSearch
本文档通过示例代码详细介绍了如何在Go应用中使用`olivere/elastic`库,涵盖了从连接到Elasticsearch、管理索引到执行复杂查询的整个流程。
127 0
|
6月前
|
存储 缓存 自然语言处理
elasticsearch 聚合 : 指标聚合、桶聚合、管道聚合解析使用总结
elasticsearch 聚合 : 指标聚合、桶聚合、管道聚合解析使用总结
|
6月前
|
缓存 Java API
在生产环境中部署Elasticsearch:最佳实践和故障排除技巧——聚合与搜索(三)
在生产环境中部署Elasticsearch:最佳实践和故障排除技巧——聚合与搜索(三)
|
7月前
|
Kubernetes 关系型数据库 MySQL
实时计算 Flink版产品使用合集之在Kubernetes(k8s)中同步MySQL变更到Elasticsearch该怎么操作
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
7月前
|
搜索推荐 JavaScript Java
Elasticsearch 8.X 如何依据 Nested 嵌套类型的某个字段进行排序?
Elasticsearch 8.X 如何依据 Nested 嵌套类型的某个字段进行排序?
100 0
下一篇
DataWorks