一、冗餘模式
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...