Elasticsearch 嵌套类型的深度剖析与实例

news2025/4/6 14:39:33

文章目录

      • **嵌套类型的原理与特点**
      • **嵌套类型的创建与映射定义**
      • **嵌套查询与过滤**
      • **嵌套聚合**
      • **实战应用举例**
    • Elasticsearch 嵌套类型的实例

Elasticsearch 索引中的嵌套类型(Nested Types)是处理具有层次结构或一对多关系数据的有效工具。它允许在文档内部定义可以包含多个相同类型对象的数组,且这些内部对象可以独立地进行查询、过滤、排序和聚合。以下是关于 Elasticsearch 嵌套类型的深度剖析与实战应用:

嵌套类型的原理与特点

1. 原理:

  • 独立索引:嵌套对象在内部被当作独立的文档进行索引,这意味着每个嵌套对象都有自己的 _source_id 和元数据,并且拥有独立的 Lucene 文档(即一个分片)。

  • 父子关系模拟:虽然嵌套对象看起来像是父文档的一部分,但实际上它们与父文档之间是通过内部机制关联起来的。这种设计使得对嵌套对象的查询和更新不会影响到父文档的其他部分。

2. 特点:

  • 精准查询与过滤:嵌套查询允许对嵌套对象的属性进行精确匹配,不受父文档其他嵌套对象属性的影响。例如,可以查找特定用户的所有评论中包含特定关键词的那一条。

  • 独立排序与聚合:嵌套对象可以独立参与排序和聚合操作,这在分析数据时非常有用,比如统计每个用户的评论数量、计算特定产品类别的平均评分等。

  • 性能优化:与使用扁平化结构(如使用 object 类型)相比,嵌套类型在查询和聚合时通常更高效,因为它避免了“伪相关性”问题,即一个嵌套对象的属性值匹配导致整个父文档被视为匹配。

嵌套类型的创建与映射定义

在创建索引时,需要明确指定嵌套字段的类型为 nested。例如,在索引映射(mapping)中定义如下结构:

PUT my_index
{
  "mappings": {
    "properties": {
      "users": {
        "type": "nested",
        "properties": {
          "id": { "type": "keyword" },
          "name": { "type": "text" },
          "comments": {
            "type": "nested",
            "properties": {
              "id": { "type": "keyword" },
              "text": { "type": "text" },
              "rating": { "type": "integer" }
            }
          }
        }
      }
    }
  }
}

这里定义了一个 users 字段,其类型为 nested,内部包含 idname 以及另一个嵌套字段 commentscomments 字段同样为 nested 类型,包含 idtextrating 属性。

嵌套查询与过滤

使用 nested 查询 DSL 来针对嵌套对象进行精确查询和过滤。例如,查找某个用户的所有评论中评分大于 4 的评论:

GET my_index/_search
{
  "query": {
    "nested": {
      "path": "users.comments",
      "query": {
        "range": {
          "users.comments.rating": {
            "gte": 4
          }
        }
      }
    }
  }
}

嵌套聚合

在聚合阶段,可以使用 nested 聚合来对嵌套对象进行分组和统计。例如,统计每个用户评论的平均评分:

GET my_index/_search
{
  "aggs": {
    "user_ratings": {
      "nested": {
        "path": "users.comments"
      },
      "aggs": {
        "avg_rating": {
          "avg": {
            "field": "users.comments.rating"
          }
        }
      }
    }
  }
}

实战应用举例

电子商务场景

  • 商品评论分析:一个商品文档中包含一个评论数组,每个评论为一个嵌套对象,包含评论者信息、评论内容、评分等。可以轻松查询特定关键词出现在哪些评论中,或者按评分对评论进行排序和分页展示。

  • 用户购物车分析:用户文档中包含一个购物车数组,每个商品项为一个嵌套对象,包含商品ID、数量、添加时间等。可以快速统计用户的购物车中有多少种商品,或者分析购物车内商品的平均价格。

社交媒体场景

  • 帖子回复分析:一个帖子文档中包含一个回复数组,每个回复为一个嵌套对象,包含回复者信息、回复内容、点赞数等。可以高效地找出某用户的所有回复中被点赞最多的那个,或者统计某个话题下所有帖子的总回复数。

  • 用户关注关系:用户文档中包含一个关注者或被关注者数组,每个为一个嵌套对象,包含对方用户ID、关注时间等。可以轻松计算用户的粉丝数、好友数,或者找出用户最晚关注的那个人。

总之,Elasticsearch 的嵌套类型为处理具有嵌套结构的数据提供了强大而灵活的支持。通过精准查询、过滤和聚合,可以深入分析数据的内在关联和模式,为业务决策提供有力的数据支撑。在实际应用中,正确理解和运用嵌套类型能够显著提升检索性能和查询精度,特别是在处理复杂的一对多关系数据时。

Elasticsearch 嵌套类型的实例

以下是一个关于电子商务场景中使用 Elasticsearch 嵌套类型的实例,以商品评论数据为例进行说明。

场景描述

假设我们运营一个电商平台,每个商品文档包含多个用户评论。每个评论是一个嵌套对象,包含评论者ID、评论内容、评分、评论日期等信息。现在,我们需要根据用户的需求进行以下操作:

  1. 查找包含特定关键词的评论。
  2. 按评分对商品评论进行排序。
  3. 统计每个商品的平均评分。

索引与映射定义

首先,创建一个名为 product_reviews 的索引,并定义其映射,包含商品信息以及嵌套的评论数组:

PUT product_reviews
{
  "mappings": {
    "properties": {
      "product_id": {
        "type": "keyword"
      },
      "product_name": {
        "type": "text"
      },
      "reviews": {
        "type": "nested",
        "properties": {
          "reviewer_id": {
            "type": "keyword"
          },
          "content": {
            "type": "text"
          },
          "rating": {
            "type": "integer"
          },
          "date": {
            "type": "date"
          }
        }
      }
    }
  }
}

数据插入

向索引中插入几个商品及其评论示例数据:

POST product_reviews/_doc
{
  "product_id": "p001",
  "product_name": "Product A",
  "reviews": [
    {
      "reviewer_id": "u001",
      "content": "Great product! Highly recommended.",
      "rating": 5,
      "date": "202Ⅰ-01-01T00:00:00Z"
    },
    {
      "reviewer_id": "u002",
      "content": "Good quality, but slightly overpriced.",
      "rating": 4,
      "date": "202Ⅰ-02-15T00:00:00Z"
    }
  ]
}

POST product_reviews/_doc
{
  "product_id": "p002",
  "product_name": "Product B",
  "reviews": [
    {
      "reviewer_id": "u003",
      "content": "Not as described, disappointed.",
      "rating": 2,
      "date": "202Ⅰ-03-¾-01T00:00:00Z"
    },
    {
      "reviewer_id": "u004",
      "content": "Excellent value for money!",
      "rating": 5,
      "date": "202Ⅰ-04-15T00:00:00Z"
    }
  ]
}

实战应用

  1. 查找包含特定关键词的评论
GET product_reviews/_search
{
  "query": {
    "nested": {
      "path": "reviews",
      "query": {
        "match": {
          "reviews.content": "recommended"
        }
      }
    }
  }
}

此查询将返回包含关键词 “recommended” 的商品及其评论。

  1. 按评分对商品评论进行排序
GET product_reviews/_search
{
  "sort": [
    {
      "reviews.rating": {
        "order": "desc",
        "nested": {
          "path": "reviews"
        }
      }
    }
  ]
}

此查询将返回所有商品,按照评论的评分从高到低排序。

  1. 统计每个商品的平均评分
GET product_reviews/_search
{
  "size": 0,
  "aggs": {
    "products": {
      "terms": {
        "field": "product_id"
      },
      "aggs": {
        "average_ratings": {
          "nested": {
            "path": "reviews"
          },
          "aggs": {
            "avg_rating": {
              "avg": {
                "field": "reviews.rating"
              }
            }
          }
        }
      }
    }
  }
}

此聚合查询将返回每个商品的ID以及其平均评分。

以上实例展示了如何在实际的电子商务场景中使用 Elasticsearch 的嵌套类型进行数据建模、查询、排序和聚合操作,以满足对商品评论数据的各种分析需求。

python推荐学习汇总连接:
50个开发必备的Python经典脚本(1-10)

50个开发必备的Python经典脚本(11-20)

50个开发必备的Python经典脚本(21-30)

50个开发必备的Python经典脚本(31-40)

50个开发必备的Python经典脚本(41-50)
————————————————

​最后我们放松一下眼睛
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1582408.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电工技术学习笔记——正弦交流电路

一、正弦交流电路 1. 正弦量的向量表示法 向量表示方法:正弦交流电路中,相量表示法是一种常用的方法,用于描述电压、电流及其相位关系。相量表示法将正弦交流信号表示为复数,通过复数的运算来描述电路中各种参数的相互关系 …

墨迹天气联合TopOn搭建创新合作模式,深挖广告流量价值 | TopOn变现案例

日前,墨迹天气与移动广告聚合管理平台TopOn达成合作,开发创新思路,通过搭建高效的合作模式,提升商业化效果广告效率和业务水平,共建新场景。 墨迹天气相关负责人表示,作为国内最早布局天气类应用的厂商之一…

python开发poc,fofa爬虫批量化扫洞

学习使用python做到批量化的漏洞脚本 1.通过fofa搜索结果来采集脚本 2.批量化扫描漏洞 ---glassfish存在任意文件读取在默认48484端口,漏洞验证的poc为: "glassfish" && port"4848" && country"CN" http://loca…

工厂水电能耗监测管理云平台

在当今工业生产中,对水电等能源的有效管控已成为企业降低成本、提升竞争力的关键所在。随着云计算、大数据以及物联网技术的飞速发展,工厂水电能耗监测管理云平台作为一种新型的能源管理解决方案,正受到越来越多企业的青睐。该平台通过云技术…

二维相位解包理论算法和软件【全文翻译- DCT相位解包裹(5.3.2)】

5.3.2 基于 DCT 的方法 在本节中,我们将详细介绍如何通过 DCT 算法解决非加权最小二乘相位解缠问题,而不是通过FFT.我们将使用公式 5.53 所定义的二维余弦变换。我们开发的算法等同于 FFT 方法 2(第 5.3.1 节)。与 FFT 方法 I 等价的 DCT 算法也可以推导出来,但我们将其作…

在Graphcore IPU上加速和扩展时态图网络

Graphcore Bow IPU机器。 一、说明 IPU 是一种全新的大规模并行处理器,与Poplar SDK共同设计,旨在加速机器智能。自第一代 Colossus IPU 以来,我们在芯片和系统架构中的计算、通信和内存方面取得了突破性进展,与 MK1 IPU 相比&…

python批量修改替换cad图纸文本,土木狗可以有

civilpy:python进行AutoCAD绘图的两个库,土木狗可以有3 赞同 0 评论文章​编辑 civilpy:python进行AutoCAD绘图批量打印,土木狗可以有2 赞同 2 评论文章​编辑 # 导入所需库 from pyautocad import Autocad, APoint import ma…

探索 PostgreSQL 的高级数据类型 - 第2部分

Navicat for PostgreSQL 是一套专为PostgreSQL设计的强大数据库管理及开发工具。它可以在PostgreSQL数据库7.5以上的版本中运行,并且支持大部份最新的PostgreSQL功能,包括触发器、函数检索及权限管理等。Navicat的的功能不仅可以满足专业开发人员的所有需…

ElasticSearch入门到掌握(3)完结

文章目录 三、深入 elasticsearch1.数据聚合(1)聚合的分类(2)DSL 实现 Bucket 聚合(3)DSL 实现 Metrics 聚合(4)RestAPI 实现聚合 2.自动补全(1)自定义分词器…

学习笔记:解决拖延

1 解决拖延、减轻压力的关键心态和方法 1.1 要点梳理 拖延是因为自己一直在逃避,重点是要有效突破逃避圈,进入学习圈,扩展成长圈。 毒蛇曲线(见思维导图)中越是临近截止期限,拖延的焦虑越上升&#xff0…

MLeaksFinder报错

1.报错:FBClassStrongLayout.mm 文件:layoutCache[currentClass] ivars; 解决:替换为layoutCache[(id)currentClass] ivars; 2.编译正常但运行时出现crash indirect_symbol_bindings[i] cur->rebinding FBRetainCycleDetector iOS15 …

算法 第36天 贪心5

435 无重叠区间 给定一个区间的集合 intervals ,其中 intervals[i] [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 。 def eraseOverlapIntervals(intervals:list)->int:if not intervals:return 0intervals.sort(keylambda x:…

ASP.NET Core 标识(Identity)框架系列(一):如何使用 ASP.NET Core 标识(Identity)框架创建用户和角色?

前言 ASP.NET Core 内置的标识(identity)框架,采用的是 RBAC(role-based access control,基于角色的访问控制)策略,是一个用于管理用户身份验证、授权和安全性的框架。 它提供了一套工具和库&…

爬虫+RPC+js逆向---直接获取加密值

免责声明:本文仅做技术交流与学习,请勿用于其它违法行为;如果造成不便,请及时联系... 目录 爬虫RPCjs逆向---直接获取加密值 target网址: 抓包 下断点 找到加密函数 分析参数 RPC流程 一坨: 二坨: 运行py,拿到加密值 爬虫RPCjs逆向---直接获取加密值 target网址: 优志…

prometheus expected a valid start token, got “\““ (“INVALID“) while parsing:

程序员的公众号:源1024,获取更多资料,无加密无套路! 最近整理了一份大厂面试资料《史上最全大厂面试题》,Springboot、微服务、算法、数据结构、Zookeeper、Mybatis、Dubbo、linux、Kafka、Elasticsearch、数据库等等 …

C++中的数组下标可以出现越界并且不报错

C中数组越界 最近用C写算法题目的时候,突然在某个题目中发现其数组下标会出现越界的情况,但是程序似乎不会报错,百思不得其解,然后自己写了个代码测试了一下,如下图所示: 当我们访问越界地址的时候&#…

rhce复习3

DNS DNS(Domain Name System)是互联网上的一项服务,它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网。 DNS系统使用的是网络的查询,那么自然需要有监听的port。DNS使用的是53端口&#x…

[react] useState的一些小细节

1.无限循环 因为setState修改是异步的,加上会触发函数重新渲染, 如果代码长这样 一秒再修改,然后重新触发setTImeout, 然后再触发,重复触发循环 如果这样呢 还是会,因为你执行又会重新渲染 2.异步修改数据 为什么修改多次还是跟不上呢? 函数传参解决 因为是异步修改 ,所以…

接口日志处理类

类:ZCL_IFLOG_UTILITIES 属性:AUTH_RESULTS_LIST 类型: TY_AUTH_RESULT Private 受保护部分: PRIVATE SECTION.TYPES: BEGIN OF ty_auth_result,funcname TYPE ztall_logcfg-funcname,pass TYPE abap_bool,END OF ty_aut…

CentOS 7 升级 5.4 内核

MatrixOne 推荐部署使用的操作系统为 Debian 11、Ubuntu 20.04、CentOS 9 等 Kernel 内核版本高于 5.0 的操作系统。随着 CentOS 7 的支持周期接近尾声,社区不少小伙伴都在讨论用以替换的 Linux 操作系统,经过问卷调查,我们发现小伙伴们的操作…