Elasticsearch学习-父子文档

这篇具有很好参考价值的文章主要介绍了Elasticsearch学习-父子文档。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

elasticsearch父子文档处理 join

  • 一、背景
  • 二、需求
  • 三、前置知识
  • 四、实现步骤
    • 1、创建 mapping
    • 2、添加父文档数据
    • 3、添加子文档
    • 4、查询文档
      • 1、根据父文档id查询它下方的子文档
      • 2、has_child返回满足条件的父文档
      • 3、has_parent返回满足父文档的子文档
  • 五、Nested Object 和 join 对比
  • 六、参考文档

一、背景

在我们工作的过程中,有些时候我们需要用到父子文档的关系映射。**比如:**一个问题有多个答案、一本书籍有多个评论等等。此处我们可以使用 es 的 jion数据类型或 nested来实现。此处我们使用join来建立es中的父子文档关系。

二、需求

我们需要创建一个计划(plan),计划下存在活动(activity)和书籍(book),书籍下存在评论(comments)。

即层级结构为:

     plan
    /    \
   /      \
activity  book
           |
           |
          comments
1234567

三、前置知识

  1. 每一个mapping下只能有一个join类型的字段。
  2. 父文档和子文档必须在同一个分片(shard)上。即: 增删改查一个子文档都必须和父文档使用相同的 routing key。
  3. 每个元素只能有一个父,但是可以存在多个子。
  4. 可以为一个已经存在的 join 字段增加新的关联关系。
  5. 可以为一个已经是父的元素增加一个子元素。

join数据类型在elasticsearch中不应该像关系型数据库那种使用。而且has_childhas_parent都是比较消耗性能的。

只有当 子的数据 远远大于 父的数据时,使用join才是有意义的。比如:一个博客下,有多个评论。

四、实现步骤

1、创建 mapping

PUT /plan_index
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1
  },
  "mappings": {
    "properties": {
      "plan_id":{
        "type": "keyword"
      },
      "plan_name":{
        "type": "text",
        "fields": {
          "keyword":{
            "type" : "keyword",
            "ignore_above" : 256
          }
        }
      },
      "act_id":{
        "type": "keyword"
      },
      "act_name":{
        "type": "text",
        "fields": {
          "keyword":{
            "type" : "keyword",
            "ignore_above" : 256
          }
        }
      },
      "comment_id":{
        "type": "keyword"
      },
      "comment_name":{
        "type": "text",
        "fields": {
          "keyword":{
            "type" : "keyword",
            "ignore_above" : 256
          }
        }
      },
      "creator":{
        "type": "keyword"
      },
      "create_time":{
        "type": "date",
        "format": "yyyy-MM-dd||yyyy-MM-dd HH:mm:ss"
      },
      "plan_join": {
        "type": "join",
        "relations": {
          "plan": ["activity", "book"],
          "book": "comments"
        }
      }
    }
  }
}
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061

注意⚠️

elasticsearch 父子文档,ES,elasticsearch,学习

2、添加父文档数据

此处添加的是 (plan) 数据。

PUT /plan_index/_doc/plan-001
{
  "plan_id": "plan-001",
  "plan_name": "四月计划",
  "creator": "huan",
  "create_time": "2021-04-07 16:27:30",
  "plan_join": {
    "name": "plan"
  }
}

PUT /plan_index/_doc/plan-002
{
  "plan_id": "plan-002",
  "plan_name": "五月计划",
  "creator": "huan",
  "create_time": "2021-05-07 16:27:30",
  "plan_join": "plan"
}
12345678910111213141516171819

注意⚠️:

1、如果是创建父文档,则需要使用 plan_join 指定父文档的关系的名字(此处为plan)。

2、plan_join为创建索引的 mapping时指定join的字段的名字。

3、指定父文档时,plan_join的这2种写法都可以。

3、添加子文档

PUT /plan_index/_doc/act-001?routing=plan-001
{
  "act_id":"act-001",
  "act_name":"四月第一个活动",
  "creator":"huan.fu",
  "plan_join":{
    "name":"activity",
    "parent":"plan-001"
  }
}

PUT /plan_index/_doc/book-001?routing=plan-001
{
  "book_id":"book-001",
  "book_name":"四月读取的第一本书",
  "creator":"huan.fu",
  "plan_join":{
    "name":"book",
    "parent":"plan-001"
  }
}

PUT /plan_index/_doc/book-002?routing=plan-001
{
  "book_id":"book-002",
  "book_name":"编程珠玑",
  "creator":"huan.fu",
  "plan_join":{
    "name":"book",
    "parent":"plan-001"
  }
}

PUT /plan_index/_doc/book-003?routing=plan-002
{
  "book_id":"book-003",
  "book_name":"java编程思想",
  "creator":"huan.fu",
  "plan_join":{
    "name":"book",
    "parent":"plan-002"
  }
}

# 理论上 comment 的父文档是 book ,但是此处routing使用 plan 也是可以的。
PUT /plan_index/_doc/comment-001?routing=plan-001
{
  "comment_id":"comment-001",
  "comment_name":"这本书还可以",
  "creator":"huan.fu",
  "plan_join":{
    "name":"comments",
    "parent":"book-001"
  }
}

PUT /plan_index/_doc/comment-002?routing=plan-001
{
  "comment_id":"comment-002",
  "comment_name":"值得一读,棒。",
  "creator":"huan.fu",
  "plan_join":{
    "name":"comments",
    "parent":"book-001"
  }
}
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566

注意⚠️:

elasticsearch 父子文档,ES,elasticsearch,学习

1、子文档(子孙文档等)需要和父文档使用相同的路由键。

2、需要指定父文档的id。

3、需要指定join的名字。

4、查询文档

1、根据父文档id查询它下方的子文档

**需求:**返回父文档id是plan-001下的类型为book的所有子文档。

GET /plan_index/_search
{
  "query":{
    "parent_id": {
      "type":"book",
      "id":"plan-001"
    }
  }
}
123456789

elasticsearch 父子文档,ES,elasticsearch,学习

2、has_child返回满足条件的父文档

**需求:**返回创建者(creator)是huan.fu,并且子文档最少有2个的父文档。

GET /plan_index/_search
{
  "query": {
    "has_child": {
      "type": "book",
      "min_children": 2,  
      "query": {
        "match": {
          "creator": "huan.fu"
        }
      }
    }
  }
}
1234567891011121314

elasticsearch 父子文档,ES,elasticsearch,学习

3、has_parent返回满足父文档的子文档

**需求:**返回父文档(book)的创建者是huan.fu的所有子文档

GET /plan_index/_search
{
  "query": {
    "has_parent": {
      "parent_type": "book",
      "query": {
        "match": {
          "creator":"huan.fu"
        }
      }
    }
  }
}
12345678910111213

elasticsearch 父子文档,ES,elasticsearch,学习

五、Nested Object 和 join 对比

Nested Object join (Parent/Child)
1、文档存储在一起,读取性能高 1、父子文档单独存储,互不影响。但是为了维护join的关系,需要占用额外的内容,读取性能略差。
2、更新父文档或子文档时,需要更新整个文档。 2、父文档和子文档可以单独更新。
3、适用于查询频繁,子文档偶尔更新的情况。 3、适用于更新频繁的情况,且子文档的数量远远超过父文档的数量。

六、参考文档

1、join数据类型

2、has child查询

3、has parent查询

4、parent id查询文章来源地址https://www.toymoban.com/news/detail-737284.html

到了这里,关于Elasticsearch学习-父子文档的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Elasticsearch中父子文档的关联:利用Join类型赋予文档的层级关系

    码到三十五 : 个人主页 心中有诗画,指尖舞代码,目光览世界,步履越千山,人间尽值得 ! Elasticsearch是一个强大的搜索引擎,它提供了丰富的功能来满足复杂的搜索需求。其中,父子索引类型的join功能是一个强大的工具,它允许我们在同一索引中创建具有层级关系的文档

    2024年04月15日
    浏览(42)
  • 解码 Elasticsearch 查询 DSL:利用 Elasticsearch 中的 has_child 和 has_parent 查询进行父子文档搜索

    今天,让我们深入研究 has_child 查询和 has_parent 查询,这将帮助我们将 2 个不同的文档组合到一个索引中,从而使我们能够将它们与关系关联起来。 这样做会对我们搜索相关文档时有很大帮助。 在使用 has_child 及 has_parent 这种关系时,我们必须使用 join 数据类型。更多有关

    2024年02月02日
    浏览(41)
  • ES Elasticsearch 五 、文档入门****

    目录 文档document介绍 手动生成id 自动生成id _source      //定制查询字段 全量替换 put 强制创建-只创建不覆盖 增加/_create 延迟删除 该状态防止磁盘写入消耗 局部更新     脚本 并发问题 文档document介绍        默认字段: _index 索引 _type 类型 _id 可以手动、自动生成 手动

    2024年02月06日
    浏览(75)
  • Elasticsearch(五)--ES文档的操作(上)---写入文档

    使用ES构建搜索引擎时需要经常对文档进行操作,除了简单的单条文档操作,有时还需要进行批量操作。我们这章主要学习ES文档的增删改的操作,由于涉及到的代码量会比较多,所以分为3篇文章分别说明文档的这个三个操作。那么我们对文档操作的学习除了在kibana客户端之

    2024年01月16日
    浏览(44)
  • Elasticsearch(七)--ES文档的操作(下)---删除文档

    上篇文章我们了解了ES的修改文档的操作,也同样分别通过ES的kibana客户端以及Java高级Rest客户端进行学习,那么本篇末尾要给大家介绍的是对文档的删除操作,同新修改文档,也有删除单条文档和批量删除文档操作,根据条件删除文档,我们本篇均会涉及到。 在ES中删除文档

    2023年04月12日
    浏览(34)
  • Elasticsearch(六)--ES文档的操作(中)---修改文档

    上篇文章我们了解了ES的插入和批量插入文档的操作,分别通过ES的kibana客户端以及Java高级Rest客户端进行学习,那么本篇则进入到对文档的修改操作,同新增文档,也有更新单条文档和批量更新文档操作,但还多出一个根据条件更新文档,我们本篇均会涉及到。 在ES中更新索

    2024年02月05日
    浏览(44)
  • 文档存储Elasticsearch系列--1 ES介绍

    前言:Elasticsearch 也是使用 Java 编写的,它的内部使用 Lucene 做索引与搜索,支持结构化文档数据的分布式存储,并提供准实时的查询,全文检索,数据聚合; 1 为什么要使用ES: ES 本身存在哪些特性使得我们放弃传统关系型数据库,ES的特点: (1)ES支持PB级别(100万G) 数据

    2024年02月13日
    浏览(35)
  • es elasticsearch 新增更新索引,新增更新文档

    先新增索引 新增映射  或者上述两步和为一步(创建索引,及创建mapping) 只能增加原有不存在的字段 创建一个全新的索引,映射包含调整后的字段或类型 将原有索引的数据迁移到新的索引 删除原有索引 将新的索引的别名设置为原来索引相同名称 创建一个 重建文档(全量

    2024年02月11日
    浏览(46)
  • 【ES】Elasticsearch核心基础概念:文档与索引

    es的核心概念主要是:index(索引)、Document(文档)、Clusters(集群)、Node(节点)与实例,下面我们先来了解一下Document与Index。 在讲解Document与Index概念之前,我们先来了解一下RESTful APIs,因为下面讲解Document和Index的时候会使用到。 当我们把es服务器启动起来之后,要怎么调用呢?

    2024年02月05日
    浏览(49)
  • 文档存储Elasticsearch系列--2 ES内部原理

    前言:ES作为nosql 的数据存储,为什么它在承载PB级别的数据的同时,又可以对外提高近实时的高效搜索,它又是通过什么算法完成对文档的相关性分析;又是怎么保证聚合的高效性; 1 ES 分布式文档存储: 1.1 文档存储: 所谓分布式文档存储,就是我们在想ES存入数据时,

    2024年02月11日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包