Elasticsearch索引文档的父子结构应用

举报
chad_chang 发表于 2022/10/28 18:41:31 2022/10/28
【摘要】 @toc 前言由于Elasticsearch没有表和表的join关系,所以设计出来一种可以文档与文档关联起来的方法,其中包括1.普通内部对象;2.嵌套结构;3.父子结构。==以下操作都是通过kibana操作== 1. 创建索引mappingPUT test01{ "mappings": { "properties": { "cust_num": { "type...

@toc


前言

由于Elasticsearch没有表和表的join关系,所以设计出来一种可以文档与文档关联起来的方法,其中包括

1.普通内部对象;
2.嵌套结构;
3.父子结构。

==以下操作都是通过kibana操作==

1. 创建索引mapping

PUT test01
{
  "mappings": {
    "properties": {
      "cust_num": {
        "type": "text"
      },
      "parent_child": {
        "type": "join",
        "relations": {
          "parent": "child"
        }
      }
    }
  }
}

解释:
1.提前在mapping中设定了一个field cust_name,type为text;
2.parent_child是父子文档关系的名字,可以自定义;
3.join 表示这个文档为父子关系;
4.relations:表示的是"父名": “子名”,也可以自定义

2. 插入一条父文档

PUT test01/_doc/01
{
  "cust_num": "张三",
  "tag": [1,3,4],
  "parent_child": {
    "name": "parent"
  }
}

因为我们在前面创建mapping的时候已经设置了relations,在设置relations的时候指定了父文档的名称为==parent==,所以我们这一条插入的是父文档。

3. 插入一条子文档

PUT test01/_doc/02?routing=01
{
  "phone_tag": [2,5],
  "parent_child": {
    "name": "child",
    "parent": "01"
  }
}

解释:
文档id我们指定的为02,首先可以判断父文档和子文档是独立的文档,其次==routing== 是路由的意思,咱们这里指的是路由到父文档的id是01,这个id和下面的parent是一致的

4. 可解决的问题

1.需要将两条文档关联起来
2.查询的时候能查询到两条文档
3.单独更新a文档,或者b文档,不影响改变另一个文档的记录。

作者应用场景:同一个客户,要存储手机银行标签和电话银行标签,但是手机银行标签和电话银行标签都需要各自能独立维护

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。