当前位置:主页 > 查看内容

Join 数据类型

发布时间:2021-05-16 00:00| 位朋友查看

简介:创作人:李增胜 Join 类型是一种特殊的数据类型,类似父子结构,一个子文档只能有一个父文档,一个父文档可以有多个子文档。 使用场景 Join 可以实现父子文档的关系存储,在什么情况下使用 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": {}
}

本文转自网络,原文链接:https://developer.aliyun.com/article/784081
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!

推荐图文


随机推荐