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