Elasticsearch中nested聚合操作

本文涉及的产品
Elasticsearch Serverless通用抵扣包,测试体验金 200元
简介: 在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"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}```  
相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。  
相关文章
|
存储 JSON 网络协议
ElasticsearchRestTemplate客户端使用
ElasticsearchRestTemplate客户端使用
|
Java 数据库连接 数据库
探究Java中的MyBatis Plus注解 @TableField:灵活处理字段映射与自动填充
在数据库操作中,字段映射和字段填充是开发者经常需要处理的问题。MyBatis Plus作为一款优秀的ORM框架,提供了注解 `@TableField`,能够帮助开发者更加灵活地处理字段映射,以及在特定场景下实现自动填充功能。本文将深入探讨 `@TableField` 注解的用法及其在持久层开发中的应用。
5512 1
|
Java Android开发 p3c
Alibaba Java Coding Guidelines安装使用教程
Alibaba Java Coding Guidelines安装使用教程
8786 0
Alibaba Java Coding Guidelines安装使用教程
|
5月前
|
人工智能 自然语言处理 运维
让搜索引擎“更懂你”:AI × Elasticsearch MCP Server 开源实战
本文介绍基于Model Context Protocol (MCP)标准的Elasticsearch MCP Server,它为AI助手(如Claude、Cursor等)提供与Elasticsearch数据源交互的能力。文章涵盖MCP概念、Elasticsearch MCP Server的功能特性及实际应用场景,例如数据探索、开发辅助。通过自然语言处理,用户无需掌握复杂查询语法即可操作Elasticsearch,显著降低使用门槛并提升效率。项目开源地址:<https://github.com/awesimon/elasticsearch-mcp>,欢迎体验与反馈。
1479 1
|
存储 自然语言处理 关系型数据库
Elasticsearch 查询时 term、match、match_phrase、match_phrase_prefix 的区别
【7月更文挑战第3天】Elasticsearch 查询时 term、match、match_phrase、match_phrase_prefix 的区别
|
前端开发 小程序 Java
【规范】SpringBoot接口返回结果及异常统一处理,这样封装才优雅
本文详细介绍了如何在SpringBoot项目中统一处理接口返回结果及全局异常。首先,通过封装`ResponseResult`类,实现了接口返回结果的规范化,包括状态码、状态信息、返回信息和数据等字段,提供了多种成功和失败的返回方法。其次,利用`@RestControllerAdvice`和`@ExceptionHandler`注解配置全局异常处理,捕获并友好地处理各种异常信息。
5658 0
【规范】SpringBoot接口返回结果及异常统一处理,这样封装才优雅
|
JSON 小程序 JavaScript
超详细微信小程序开发学习笔记,看完你也可以动手做微信小程序项目
这篇文章是一份全面的微信小程序开发学习笔记,涵盖了从小程序介绍、环境搭建、项目创建、开发者工具使用、文件结构、配置文件、模板语法、事件绑定、样式规范、组件使用、自定义组件开发到小程序生命周期管理等多个方面的详细教程和指南。
|
存储 搜索推荐 数据可视化
【Elasticsearch】Elasticsearch索引创建与管理详解
【Elasticsearch】Elasticsearch索引创建与管理详解
1317 10
Elasticsearch 更新指定字段
讲述Elasticsearch更新索引指定字段操作
|
JSON 自然语言处理 对象存储
通义千问开源模型在PAI灵骏的最佳实践
本文将展示如何基于阿里云PAI灵骏智算服务,在通义千问开源模型之上进行高效分布式继续预训练、指令微调、模型离线推理验证以及在线服务部署。