9 es 資料建模

2021-10-06 22:57:06 字數 2941 閱讀 8107

一、冗餘模式

1、將可能會進行搜尋的條件和要搜尋的結果,放在乙個doc中

2、例如:

二、檔案系統資料建模

1、path_hierarchy分詞器

功能:/a/b/c/d --> path_hierarchy -> /a/b/c/d, /a/b/c, /a/b, /a

2、實戰

(1)、建索引,建path_hierarchy分詞器

put /fs}}

}}(3)、構造資料

put /fs/file/1

(4)、查詢1:查詢乙份,內容包括elasticsearch,在/workspace/projects/hellworld這個目錄下的檔案

get /fs/file/_search },}

}}]}

}}(5)、查詢2:搜尋/workspace目錄下,內容包含elasticsearch的所有的檔案

get /fs/file/_search },}

}}]}

}}三、全域性鎖

1、全域性鎖是悲觀鎖,且是index級別的

2、建立全域性鎖

put /index/lock/global/_create {}----------->對這個index建立鎖

fs: 你要上鎖的那個index

lock: 就是你指定的乙個對這個index上全域性鎖的乙個type

global: 就是你上的全域性鎖對應的這個doc的id

_create:強制必須是建立,如果/fs/lock/global這個doc已經存在,那麼建立失敗,報錯

這時,要是有另外乙個執行緒也執行:put /index/lock/global/_create {} 則會報錯。

解鎖:delete /fs/lock/global-------------->就是直接刪除

3、全域性鎖的有缺點

優點:操作非常簡單,非常容易使用,成本低

缺點:你直接就把整個index給上鎖了,這個時候對index中所有的doc的操作,都會被block住,導致整個系統的併發能力很低

四、document 鎖

1、document鎖,是用指令碼進行上鎖

post /fs/lock/1/_update------->index/type/doc_id

,--------->沒有則insert,有則更新

"script": "if ( ctx._source.process_id != process_id ) ; ctx.op = 'noop';"-------->指令碼

"params":

}解鎖:put /fs/lock/_bulk

}process_id: 每個執行緒都用uuid自動生成乙個thread id,你的系統程序啟動的時候給整個程序也分配乙個uuid。process_id + thread_id就代表了某乙個程序下的某個執行緒的唯一標識

五、排他鎖與共享鎖

1、就是讀寫鎖,讀讀共享、寫寫互斥、讀寫互斥

2、共享鎖

上鎖:post /fs/lock/1/_update 

,"script":

}解鎖:

post /fs/lock/1/_update

}3、排查鎖

上鎖:put /fs/lock/1/_create

解鎖:delete /fs/lock/1

六、nested object

1、普通object資料結構

put /website/blogs/6,]

}2、nested object 資料結構

3、nested object 搜尋

get /website/blogs/_search 

},},}]

}}}}

]}}}

七、nested object聚合操作

get /website/blogs/_search 

, "aggs": ,

"aggs": }}

}}}}

}八、父子關係資料建模

1、parent child建模方式:父doc和子doc分別在進行更新的時候,都不會影響對方

要點:父子關係元資料對映,用於確保查詢時候的高效能,但是有乙個限制,就是父子資料必須存在於乙個shard中

2、案例背景:研發中心員工管理案例,乙個it公司有多個研發中心,每個研發中心有多個員工

"employee": }}

}post /company/rd_center/_bulk}}

}put /company/employee/1?parent=1 ---------->指定父type

注:doc routing,employee和rd_center的資料,都會用parent id作為routing,這樣就會到乙個shard

3、父子關係搜尋

(1)、搜尋有2023年以後出生的員工的研發中心

get /company/rd_center/_search}}

}}}(2)、搜尋在中國的研發中心的員工

get /company/employee/_search }}

}}九、祖孫三代資料建模

1、背景:country -> rd_center -> employee,祖孫三層資料模型

post /company/country/_bulk}}

post /company/rd_center/_bulk}}

}put /company/employee/1?parent=1&routing=1

routing=1----------->爺爺輩資料的id

查詢:get /company/country/_search}}

}}}}

ES資料建模最佳實踐

如何對欄位進行建模 最佳實踐 其他demo 參考資料建模是對真實世界進行描述的一種工具和方法,實現對現實世界的對映 keyword 使用於 filter,sorting 及 aggregations 多欄位型別 數值型別 列舉型別 如果不需要檢索 如不需要排序或者聚合分析,更新頻繁,聚合查詢頻繁的 ...

ES資料建模最佳實踐

優先考慮普通物件,其次考慮nested巢狀物件,再考慮關聯物件。避免過多的字段,欄位過多不易維護,且影響集群效能。可以用nested巢狀物件結合key val方式把橫向儲存的資料轉為縱向儲存。避免字首正則匹配,嚴重影響效能。可以把text轉為物件的方式儲存,便於多種方式檢索。put cookie s...

es建立模板

建立模板 注 1.讀取templatefilepath目錄下所有.json結尾的檔案 2.模板名為檔名稱 3.模板內容為檔案內容 param templatefilepath 模板檔案路徑 public static void createestemplate string templatefile...