ElasticSearch nested parent/child join

ElasticSearch  nested parent/child join

ElasticSearch  7.2.0

1、创建索引含有nested类型的索引

2、添加数据(nested)

3、查询(nested)

4、创建含有关联关系的索引

5、添加数据(parent/child join)

   5.1 添加父文档
   5.2 添加子文档

6、查询(parent/child join)

   6.1 Parent Id 查询
   6.2 Has Child 查询
   6.3 Has Parent 查询
   6.4 通过ID和routing

7、nested VS parent/child join

对人工智能感兴趣点下面链接

现在人工智能非常火爆,很多朋友都想学,但是一般的教程都是为博硕生准备的,太难看懂了。最近发现了一个非常适合小白入门的教程,不仅通俗易懂而且还很风趣幽默。所以忍不住分享一下给大家。点这里可以跳转到教程。

https://www.cbedai.net/u014646662

1、创建索引含有nested类型的索引

PUT my_blogs_nested
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 0
  },
  "mappings": {
    "properties": {
      "blog_comments_relation":{
        
          "type" : "nested",
          "properties" : {
            "comment" : {
              "type" : "text",
              "norms" : false,
              "fields" : {
                "keyword" : {
                  "type" : "keyword"
                }
              }
            },
            "username" : {
              "type" : "text",
              "norms" : false,
              "fields" : {
                "keyword" : {
                  "type" : "keyword"
                }
              }
            }
          }
        
      },
      "content":{
        "type":"text"
      },
      "title":{
        "type":"text",
        "norms":false,
        "fields": {
          "keyword":{
            "type":"keyword"
          }
        }
      } 
    }
  }
}

2、添加数据(nested)

PUT my_blogs_nested/_doc/blog1
{
  "title":"Learning ElasticSearch",
  "content":"Learning Elastic Stack",
  "blog_comments_relation":[
    {
      "comment":"I am learning Elatsic Stack",
      "username":"Lucky"
    },{
      "comment":"Hello ElasticSearch",
      "username":"Bob"
    }
  ]
}

PUT my_blogs_nested/_doc/blog2
{
  "title":"Leaning Hadoop",
  "content":"Leaning Hadoop",
  "blog_comments_relation":[
    {
      "comment":"I am learning Hadoop",
      "username":"Lucy"
    },{
      "comment":"Hello Hadoop",
      "username":"Bob"
    }
  ]
}

3、查询(nested)

#查看索引
GET my_blogs_nested

#查询文档
GET my_blogs_nested/_search
{
  "query": {
    "nested": {
      "path": "blog_comments_relation",
      "query": {
        "match": {
          "blog_comments_relation.username": "lucy"
        }
      }
    }
  }
}

4、创建含有关联关系的索引

"blog":"comment",即父文档是blog,子文档是comment,子文档可以有多个(一对多的关系)

PUT my_blogs
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 0
  },
  "mappings": {
    "properties": {
      "blog_comments_relation":{
        "type": "join",
        "relations":{
          "blog":"comment"
        }
      },
      "content":{
        "type":"text"
      },
      "title":{
        "type":"text",
        "norms":false,
        "fields": {
          "keyword":{
            "type":"keyword"
          }
        }
      } 
    }
  }
}

5、添加数据(parent/child join)

5.1 添加父文档

"name":"blog" 父文档名


PUT my_blogs/_doc/blog1
{
  "title":"Learning ElasticSearch",
  "content":"Learning Elastic Stack",
  "blog_comments_relation":{
    "name":"blog"
  }
}

PUT my_blogs/_doc/blog2
{
  "title":"Leaning Hadoop",
  "content":"Leaning Hadoop",
  "blog_comments_relation":{
    "name":"blog"
  }
}

5.2 添加子文档

"name":"comment", 子文档名
 "parent":"blog1",指定父文档的ID

routing=blog1,子文档和父文档必须在同一个分片上,路由到父文档的ID

PUT my_blogs/_doc/comment3?routing=blog2
{
  "comment":"Hello Hadoop",
  "username":"Bob",
  "blog_comments_relation":{
    "name":"comment",
    "parent":"blog2"
  }
}

PUT my_blogs/_doc/comment4?routing=blog1
{
  "comment":"Hello ElasticSearch",
  "username":"Bob",
  "blog_comments_relation":{
    "name":"comment",
    "parent":"blog1"
  }
}

6、查询(parent/child join)

6.1 Parent Id 查询

GET my_blogs/_search
{
  "query": {
    "parent_id":{
      "type":"comment",
      "id":"blog2"
    }
  }
}

6.2 Has Child 查询,返回父文档

GET my_blogs/_search
{
  "query": {
    "has_child": {
      "type": "comment",
      "query": {
        "match": {
          "username": "lucky"
        }
      }
    }
  }
}

6.3 Has Parent 查询,返回相关的子文档

GET my_blogs/_search
{
  "query": {
    "has_parent": {
      "parent_type": "blog",
      "query": {
        "match": {
          "content": "elastic"
        }
      }
    }
  }
}

6.4 通过ID和routing ,访问子文档(不加routing查不到)

GET my_blogs/_doc/comment3?routing=blog2

7、 nested VS parent/child join

 nestedparent/child join
优点读取性能高父子文档可以独立更新
缺点每次更新需要更新整个文档关联关系,需要额外的内存,查询效率相对较差
场景频繁查询频繁更新

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值