当前位置: 首页 > article >正文

ElasticSearch-Nested 类型与 Object 类型的区别

在 Elasticsearch 中,nested 类型和 object 类型都用于处理嵌套的 JSON 数据,但它们在存储和查询方面有着显著的区别。本文将详细解释这两种类型的区别,并提供具体的示例。

一、基本概念

1. object 类型

  • 定义object 类型是 Elasticsearch 默认的嵌套类型,用于表示 JSON 对象。Elasticsearch 会自动将 object 类型的字段展平存储。

  • 存储方式:Elasticsearch 会将 object 类型的字段展平,存储为多个独立的字段。例如,一个包含多个属性的对象数组会被展平为多个数组字段。

  • 查询方式:可以直接使用普通的查询语句,通过点号(.)连接字段路径进行查询。

2. nested 类型

  • 定义nested 类型是一种特殊的 object 类型,每个嵌套对象会被索引为一个独立的隐藏文档。这允许对嵌套对象进行精确的查询和过滤。

  • 存储方式:每个嵌套对象被索引为一个独立的文档,存储时保持了对象的独立性。

  • 查询方式:需要使用 nested 查询来查询嵌套对象。

二、具体区别

1. 存储方式

  • object 类型:Elasticsearch 会将 object 类型的字段展平存储。例如,一个包含多个属性的对象数组会被展平为多个数组字段。这种展平存储方式可能会导致一些查询问题,特别是当需要对嵌套对象进行精确查询时。

  • nested 类型:每个嵌套对象被索引为一个独立的文档,存储时保持了对象的独立性。这使得对嵌套对象的查询更加精确和灵活。

2. 查询方式

  • object 类型:可以直接使用普通的查询语句,通过点号(.)连接字段路径进行查询。

{
  "query": {
    "term": {
      "inspector.id": {
        "value": "222"
      }
    }
  }
}
  • nested 类型:需要使用 nested 查询来查询嵌套对象。

{
  "query": {
    "nested": {
      "path": "inspector",
      "query": {
        "term": {
          "inspector.id": {
            "value": "222"
          }
        }
      }
    }
  }
}

3. 查询结果

  • object 类型:由于 object 类型的字段被展平存储,有时会导致“且”查询变成“或”查询。例如,查询同时包含“欧莱雅”和“美白”的文档时,可能会返回不正确的结果。

  • nested 类型nested 类型的查询可以精确地匹配嵌套对象,避免了上述问题。例如,查询同时包含“欧莱雅”和“美白”的文档时,不会返回任何结果,因为没有任何一个嵌套对象同时具备这两个属性。

四、总结

  • object 类型:适用于简单的嵌套结构,数据被展平存储,不支持复杂的嵌套查询。

  • nested 类型:适用于需要复杂查询的嵌套结构,支持对嵌套对象的精确查询和过滤。

根据具体的业务需求选择合适的数据类型,以优化查询性能和数据建模的复杂性。如果需要对嵌套对象进行精确的查询和过滤,建议使用 nested 类型。如果嵌套结构简单,且不需要复杂的查询,可以使用 object 类型。


http://www.kler.cn/a/504899.html

相关文章:

  • jenkins-系统配置概述
  • SpringData-Redis缓存之RedisTemplate
  • 初识算法和数据结构P1:保姆级图文详解
  • Vue3使用vue-count-to数字滚动模块报错解决方案
  • 【网络云SRE运维开发】2025第3周-每日【2025/01/14】小测-【第13章ospf路由协议】理论和实操
  • vue 与 vue-json-viewer 实现 JSON 数据可视化
  • 交叉编译avahi到aarch64平台
  • iOS - 内存屏障的使用场景
  • 【机器学习】实战:天池工业蒸汽量项目(三)模型预测
  • 速通Docker === 介绍与安装
  • Graylog采集MySQL慢日志实战
  • 源码编译安装httpd 2.4,提供系统服务管理脚本并测试
  • jenkins docker 遇到 /var/run/docker.sock: permission denied 解决方案
  • 【JavaEE进阶】SpringMVC 响应
  • 代码随想录算法训练营第三十四天-动态规划-63. 不同路径II
  • vue运用uniapp框架开发企业微信小程序中常用的一些基础方法
  • C#,入门教程(27)——应用程序(Application)的基础知识
  • JavaScript:模版字符串
  • scons通用构建_生成方法Command
  • 向量数据库如何助力Text2SQL处理高基数类别数据
  • 更新用户密码功能
  • 解决nginx: [emerg] unknown directive “stream“ in /etc/nginx/nginx.conf问题 --九五小庞
  • LeetCode | 解锁数组与字符串的秘密:经典题型详解与高效解法
  • 20250113面试鸭特训营第21天
  • STLG_01_12_程序设计C语言 - 联合体和枚举类型
  • 【AIGC-ChatGPT进阶提示词指令】智慧母婴:打造基于成长树的儿童发展引导系统