亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何處理elasticsearch父子文檔

發布時間:2021-10-11 21:42:35 來源:億速云 閱讀:209 作者:iii 欄目:編程語言

這篇文章主要介紹“如何處理elasticsearch父子文檔”,在日常操作中,相信很多人在如何處理elasticsearch父子文檔問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”如何處理elasticsearch父子文檔”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

一、背景

在我們工作的過程中,有些時候我們需要用到父子文檔的關系映射。**比如:**一個問題有多個答案、一本書籍有多個評論等等。此處我們可以使用 es 的 jion數據類型或 nested來實現。此處我們使用join來建立es中的父子文檔關系。

二、需求

我們需要創建一個計劃(plan),計劃下存在活動(activity)和書籍(book),書籍下存在評論(comments)。

即層級結構為:

     plan
    /    \
   /      \
activity  book
           |
           |
          comments

三、前置知識

  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"
        }
      }
    }
  }
}

注意??

如何處理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"
}

注意??:

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"
  }
}

注意??:

如何處理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"
    }
  }
}

2、has_child返回滿足條件的父文檔

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

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

如何處理elasticsearch父子文檔

3、has_parent返回滿足父文檔的子文檔

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

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

如何處理elasticsearch父子文檔

五、Nested Object 和 join 對比

Nested Objectjoin (Parent/Child)
1、文檔存儲在一起,讀取性能高1、父子文檔單獨存儲,互不影響。但是為了維護join的關系,需要占用額外的內容,讀取性能略差。
2、更新父文檔或子文檔時,需要更新整個文檔。2、父文檔和子文檔可以單獨更新。
3、適用于查詢頻繁,子文檔偶爾更新的情況。3、適用于更新頻繁的情況,且子文檔的數量遠遠超過父文檔的數量。

到此,關于“如何處理elasticsearch父子文檔”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

织金县| 黄浦区| 沂源县| 宜君县| 天镇县| 塔城市| 茌平县| 尼木县| 西平县| 福泉市| 庐江县| 衡水市| 三门峡市| 六盘水市| 泽库县| 华容县| 湟中县| 许昌县| 织金县| 普格县| 伊宁县| 盐山县| 三门县| 德昌县| 昆明市| 和静县| 礼泉县| 东兰县| 亚东县| 册亨县| 陇川县| 瑞丽市| 大方县| 安陆市| 利辛县| 正蓝旗| 平利县| 福建省| 太保市| 萍乡市| 黄大仙区|