本文属于极客时间Elasticsearch核心技术与实战学习笔记系列。
对象和 Nested 对象的局限性
每次更新,需要重新索引整个对象(包括跟对象和嵌套对象)ES 提供了类似关系型数据库中 Join 的实现。使用 Join 数据类型实现,可以通过 Parent / Child 的关系,从而分离两个对象
父文档和子文档是两个独立的文档更新父文档无需重新索引整个子文档。子文档被新增,更改和删除也不会影响到父文档和其他子文档。定义父子关系的几个步骤
设置索引的 Mapping索引父文档索引子文档按需查询文档设置 Mapping
索引父文档
创建索引
DELETE my_blogs # 设定 Parent/Child Mapping 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" } }Parent / Child 所支持的查询
查询所有文档Parent Id 查询Has Child 查询Has Parent 查询 #根据父文档ID查看 GET my_blogs/_doc/blog2 #返回 { "_index" : "my_blogs", "_type" : "_doc", "_id" : "blog2", "_version" : 1, "_seq_no" : 1, "_primary_term" : 1, "found" : true, "_source" : { "title" : "Learning Hadoop", "content" : "learning Hadoop", "blog_comments_relation" : { "name" : "blog" } } }Parent Id 查询 :这里就是通过blog查询评论的信息
# Has Child 查询,返回父文档:demo就是通过评查询blog信息 ,
#通过ID ,访问子文档 GET my_blogs/_doc/comment3
{ "_index" : "my_blogs", "_type" : "_doc", "_id" : "comment3", "found" : false }
