带你读《Elastic Stack 实战手册》之21:——3.4.2.6.Join数据类型

本文涉及的产品
Elasticsearch Serverless通用抵扣包,测试体验金 200元
简介: 带你读《Elastic Stack 实战手册》之21:——3.4.2.6.Join数据类型

3.4.2.6.Join数据类型


创作人李增胜

 

Join 类型是一种特殊的数据类型,类似父子结构,一个子文档只能有一个父文档,一个父文档可以有多个子文档。

 

使用场景

 

Join 可以实现父子文档的关系存储,在什么情况下使用 Join 类型呢?假设我们存在这种场景,售卖的商品有评价信息,商品信息不会经常发生变更,但是评论信息就更新的比较频繁了,此时就可以使用 Join 数据类型来处理此种业务, 一对多关系存在多个文档中,父子文档更新性能高,可独立更新,互不影响。

 

在实际使用场景中,推荐使用 Data denormalization 来解决过多关联查询问题,字面解读就是非规范化存储”,通过冗余存储多字段来达到过多关联的查询问题,避免使用 Join 数据类型,虽然带来了关联的方便性,但是会带来额外的查询开销影响搜索性能。

 

此外,Kibana 对 Join 以及 Nested 的支持也比较少


#定义索引,my_goods_sale 为售卖的商品信息,my_goods_comment 为商品的评价信息
PUT my_goods_hot_sale
{
  "mappings": {
    "properties": {
      "my_id": {
        "type": "keyword"
      },
      "my_join_field": { 
        "type": "join",
        "relations": {
          "my_goods_sale": "my_goods_comment" 
        }
      }
    }
  }
}
#添加商品售卖 ID 为1的信息
PUT my_goods_hot_sale/_doc/1?refresh
{
  "my_id": "1",
  "text": "This is a my_goods_sale",
  "my_join_field": {
    "name": "my_goods_sale" 
  }
}
#添加商品售卖 ID 为2的信息
PUT my_goods_hot_sale/_doc/2?refresh
{
  "my_id": "2",
  "text": "This is another my_goods_sale",
  "my_join_field": {
    "name": "my_goods_sale"
  }
}
#添加商品售卖 ID 为3,父商品为1,注意父子文档一定要在一个 shard 上
PUT my_goods_hot_sale/_doc/3?routing=1&refresh
{
  "my_id": "3",
  "text": "This is an comment",
  "my_join_field": {
    "name": "my_goods_comment", 
"parent": "1" 
  }
}
#添加商品售卖 ID 为4,父商品为1
PUT my_goods_hot_sale/_doc/4?routing=1&refresh
{
  "my_id": "4",
  "text": "This is another comment",
  "my_join_field": {
    "name": "my_goods_comment",
    "parent": "1"
  }
}

根据父文档查询子文档


GET my_goods_hot_sale/_search
{
  "query": {
    "has_parent": {
      "parent_type": "my_goods_sale",
      "query": {
        "match": {
          "text": "my_goods_sale"
        }
      }
    }
  }
}

根据子文档查询父文档


GET my_goods_hot_sale/_search
{
  "query": {
    "has_child": {
      "type": "my_goods_comment",
      "query": {
        "match_all": {}
      }
    }
  }
}

创作人简介

李增胜,Elasticsearch 认证工程师、PMP 项目管理认证,现就职于汇通达网络股份有限公司,任产业交易平台交易域技术经理,从事微服务架构、搜索架构方向开发与管理工作。技术关注:电商、产业互联网等领域。

博客:https://www.jianshu.com/u/59dceda66b57

 

 

相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。  
相关文章
|
XML Java Unix
setting.xml配置文件详解
maven是JAVA开发人员经常使用的工具之一,最核心的配置文件是setting.xml,本文对setting.xml做简要分析,梳理xml每个节点的说明。
1214 0
|
10月前
|
JSON 分布式计算 数据处理
加速数据处理与AI开发的利器:阿里云MaxFrame实验评测
随着数据量的爆炸式增长,传统数据分析方法逐渐显现出局限性。Python作为数据科学领域的主流语言,因其简洁易用和丰富的库支持备受青睐。阿里云推出的MaxFrame是一个专为Python开发者设计的分布式计算框架,旨在充分利用MaxCompute的强大能力,提供高效、灵活且易于使用的工具,应对大规模数据处理需求。MaxFrame不仅继承了Pandas等流行数据处理库的友好接口,还通过集成先进的分布式计算技术,显著提升了数据处理的速度和效率。
|
11月前
|
Shell 分布式数据库 Hbase
如何使用 HBase Shell 进行数据的批量导入和导出?
如何使用 HBase Shell 进行数据的批量导入和导出?
810 5
|
12月前
|
人工智能 Cloud Native 容灾
云数据库“再进化”,OB Cloud如何打造云时代的数据底座?
云数据库“再进化”,OB Cloud如何打造云时代的数据底座?
281 2
|
12月前
|
存储 分布式计算 自然语言处理
大数据中非结构化数据
【10月更文挑战第18天】
909 4
|
11月前
|
人工智能 分布式计算 数据可视化
大模型私有化部署全攻略:硬件需求、数据隐私、可解释性与维护成本挑战及解决方案详解,附示例代码助你轻松实现企业内部AI应用
【10月更文挑战第23天】随着人工智能技术的发展,企业越来越关注大模型的私有化部署。本文详细探讨了硬件资源需求、数据隐私保护、模型可解释性、模型更新和维护等方面的挑战及解决方案,并提供了示例代码,帮助企业高效、安全地实现大模型的内部部署。
2155 2
|
存储 运维 关系型数据库
探索 Apache Paimon 在阿里智能引擎的应用场景
本文整理自Apache Yarn && Flink Contributor,阿里巴巴智能引擎事业部技术专家王伟骏(鸿历)老师在 5月16日 Streaming Lakehouse Meetup · Online 上的分享。
26089 34
探索 Apache Paimon 在阿里智能引擎的应用场景
|
Shell 分布式数据库 Hbase
使用 HBase Shell 进行数据的批量导入和导出
使用 HBase Shell 进行数据的批量导入和导出
1159 6
|
数据采集 搜索推荐 机器人
Python 神器:wxauto 库
Python 神器:wxauto 库
2433 1
|
存储 Java 应用服务中间件
在线学习|作业提交|基于SSM+VUE的在线课程学习及作业提交系统的设计与实现
在线学习|作业提交|基于SSM+VUE的在线课程学习及作业提交系统的设计与实现
493 0