带你读《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并实现搜索。  
相关文章
|
Linux Android开发 iOS开发
建议收藏!8款音乐APP,找不到喜欢的,算我输!
最近一段时间,有不少同学反复询问我音乐相关的软件。 在以前的文章中,我先后介绍过很多音乐相关的APP,其中不乏一时之间让我非常惊艳的。
建议收藏!8款音乐APP,找不到喜欢的,算我输!
|
机器学习/深度学习 人工智能 自然语言处理
AI与创意产业:艺术与技术的交叉点
【10月更文挑战第10天】AI与创意产业的融合是未来的必然趋势。这种融合不仅改变了艺术创作的方式,还提升了创意产业的效率和创新能力。然而,我们也需要认识到AI在创意产业中的应用所面临的挑战和问题,并寻找解决方案。通过科技与艺术的跨界合作,我们可以共同推动创意产业的创新发展,为人类社会带来更多的美好和惊喜。 AI与创意产业的交叉点既是机遇也是挑战。只有不断探索和创新,我们才能在这个充满变革的时代中立于不败之地。
|
11月前
|
开发框架 人工智能 安全
Promptic:轻量级 LLM 应用开发框架,提供完善的底层功能,使开发者更专注于构建上层功能
Promptic 是一个轻量级的 LLM 应用开发框架,支持通过一行代码切换不同的 LLM 服务提供商。它提供了类型安全的输出、流式支持、内置对话记忆、错误处理和重试等功能,帮助开发者专注于构建功能,而不是底层的复杂性。
242 6
Promptic:轻量级 LLM 应用开发框架,提供完善的底层功能,使开发者更专注于构建上层功能
|
Cloud Native 关系型数据库 分布式数据库
开发者如何使用云原生数据库PolarDB
【10月更文挑战第5天】开发者如何使用云原生数据库PolarDB
410 2
|
NoSQL 测试技术 Go
自动化测试在 Go 开源库中的应用与实践
本文介绍了 Go 语言的自动化测试及其在 `go mongox` 库中的实践。Go 语言通过 `testing` 库和 `go test` 命令提供了简洁高效的测试框架,支持单元测试、集成测试和基准测试。`go mongox` 库通过单元测试和集成测试确保与 MongoDB 交互的正确性和稳定性,使用 Docker Compose 快速搭建测试环境。文章还探讨了表驱动测试、覆盖率检查和 Mock 工具的使用,强调了自动化测试在开源库中的重要性。
277 0
|
存储 Java 应用服务中间件
在线学习|作业提交|基于SSM+VUE的在线课程学习及作业提交系统的设计与实现
在线学习|作业提交|基于SSM+VUE的在线课程学习及作业提交系统的设计与实现
507 0
|
存储 运维 资源调度
云资源的使用规范是什么?
【5月更文挑战第9天】云资源的使用规范是什么?
444 1
|
消息中间件 并行计算 JavaScript
如何训练自己的ChatGPT
如何训练自己的ChatGPT
如何训练自己的ChatGPT
|
网络安全
ssh 避免首次登录输入yes
ssh初次登录某个主机时,出现如下提示 Are you sure you want to continue connecting (yes/no)? 1 如何去掉? 打开/etc/ssh/ssh_config,修改以下配置项 StrictHostKey...
3013 0

热门文章

最新文章