您好,登錄后才能下訂單哦!
這篇文章主要介紹“如何處理elasticsearch父子文檔”,在日常操作中,相信很多人在如何處理elasticsearch父子文檔問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”如何處理elasticsearch父子文檔”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
在我們工作的過程中,有些時候我們需要用到父子文檔的關系映射。**比如:**一個問題有多個答案、一本書籍有多個評論等等。此處我們可以使用 es 的 jion
數據類型或 nested
來實現。此處我們使用join
來建立es中的父子文檔關系。
我們需要創建一個計劃(plan
),計劃下存在活動(activity
)和書籍(book
),書籍下存在評論(comments
)。
即層級結構為:
plan / \ / \ activity book | | comments
每一個mapping
下只能有一個join
類型的字段。
父文檔和子文檔必須在同一個分片(shard
)上。即: 增刪改查一個子文檔都必須和父文檔使用相同的 routing key。
每個元素只能有一個父,但是可以存在多個子。
可以為一個已經存在的 join 字段增加新的關聯關系。
可以為一個已經是父的元素增加一個子元素。
join
數據類型在elasticsearch
中不應該像關系型數據庫那種使用。而且has_child
和has_parent
都是比較消耗性能的。只有當 子的數據 遠遠大于 父的數據時,使用
join
才是有意義的。比如:一個博客下,有多個評論。
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" } } } } }
注意??
此處添加的是 (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種寫法都可以。
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" } }
注意??:
1、子文檔(子孫文檔等)需要和父文檔使用相同的路由鍵。
2、需要指定父文檔的id。
3、需要指定join的名字。
**需求:**返回父文檔id是plan-001下的類型為book的所有子文檔。
GET /plan_index/_search { "query":{ "parent_id": { "type":"book", "id":"plan-001" } } }
**需求:**返回創建者(creator)是huan.fu,并且子文檔最少有2個的父文檔。
GET /plan_index/_search { "query": { "has_child": { "type": "book", "min_children": 2, "query": { "match": { "creator": "huan.fu" } } } } }
**需求:**返回父文檔(book)的創建者是huan.fu的所有子文檔
GET /plan_index/_search { "query": { "has_parent": { "parent_type": "book", "query": { "match": { "creator":"huan.fu" } } } } }
Nested Object | join (Parent/Child) |
---|---|
1、文檔存儲在一起,讀取性能高 | 1、父子文檔單獨存儲,互不影響。但是為了維護join的關系,需要占用額外的內容,讀取性能略差。 |
2、更新父文檔或子文檔時,需要更新整個文檔。 | 2、父文檔和子文檔可以單獨更新。 |
3、適用于查詢頻繁,子文檔偶爾更新的情況。 | 3、適用于更新頻繁的情況,且子文檔的數量遠遠超過父文檔的數量。 |
到此,關于“如何處理elasticsearch父子文檔”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。