ElasticSearch | 文档的父子关系

2020-05-28  本文已影响0人  乌鲁木齐001号程序员

对象 | Nested 对象 | 局限性

Parent & Child

定义父子关系的几个步骤

文档父子关系 | 举个栗子

创建索引 | 设置父子关系
DELETE my_blogs

PUT my_blogs
{
  "settings": {
    "number_of_shards": 2
  },
  "mappings": {
    "properties": {
      "blog_comments_relation": {
        "type": "join",
        "relations": {
          "blog": "comment"
        }
      },
      "content": {
        "type": "text"
      },
      "title": {
        "type": "keyword"
      }
    }
  }
}
索引父文档
PUT my_blogs/_doc/blog1
{
  "title":"Learning Elasticsearch",
  "content":"learning ELK @ geektime",
  "blog_comments_relation":{
    "name":"blog"
  }
}

PUT my_blogs/_doc/blog2
{
  "title":"Learning Hadoop",
  "content":"learning Hadoop",
    "blog_comments_relation":{
    "name":"blog"
  }
}
索引子文档
PUT my_blogs/_doc/comment1?routing=blog1
{
  "comment":"I am learning ELK",
  "username":"Jack",
  "blog_comments_relation":{
    "name":"comment",
    "parent":"blog1"
  }
}

PUT my_blogs/_doc/comment2?routing=blog2
{
  "comment":"I like Hadoop!!!!!",
  "username":"Jack",
  "blog_comments_relation":{
    "name":"comment",
    "parent":"blog2"
  }
}

PUT my_blogs/_doc/comment3?routing=blog2
{
  "comment":"Hello Hadoop",
  "username":"Bob",
  "blog_comments_relation":{
    "name":"comment",
    "parent":"blog2"
  }
}
查询所有文档
POST my_blogs/_search
{

}
根据父文档 Id 查询
GET my_blogs/_doc/blog2
parent_id 查询 | 通过父文档 Id 查其子文档
POST my_blogs/_search
{
  "query": {
    "parent_id": {
      "type": "comment",
      "id": "blog2"
    }
  }
}
has_child 查询 | 通过子文档中的信息查询父文档
POST my_blogs/_search
{
  "query": {
    "has_child": {
      "type": "comment",
      "query" : {
          "match": {
              "username" : "Jack"
          }
        }
    }
  }
}
has_parent 查询 | 查父文档中的内容得到子文档
POST my_blogs/_search
{
  "query": {
    "has_parent": {
      "parent_type": "blog",
      "query" : {
          "match": {
              "title" : "Learning Hadoop"
          }
      }
    }
  }
}
只通过子文档 Id 访问子文档
GET my_blogs/_doc/comment3
通过子文档 Id 和 routing 查找子文档
GET my_blogs/_doc/comment3?routing=blog2
更新子文档
PUT my_blogs/_doc/comment3?routing=blog2
{
    "comment": "Hello Hadoop??",
    "blog_comments_relation": {
      "name": "comment",
      "parent": "blog2"
    }
}

Nested 对象 vs 父子文档

  Nested Object Parent / Child
优点 文档存储在一起,读取性能好 父子文档可以独立更新
缺点 更新嵌套的子文档时,需要更新整个文档 需要额外的内存维护关系,读取性能相对较差
适用场景 子文档偶尔更新,以查询为主 子文档更新频繁
上一篇 下一篇

猜你喜欢

热点阅读