目錄
-
數據流程圖和關係
-
數據流程圖
-
數據流程關係
- 一對一: 收 ,收件入庫,派,問題件,留倉件,簽收 ; 發 到
- 一對多(多對一): 收(收件入庫,派,問題件,留倉件,簽收 ) 和 發 (到)
-
需求描述
- 實時統計 每個網點,每天 發件未到件,發件未簽收的快遞單數(一對一,多對一)
- 實時統計 每個網點,每天 收件 未發件的快遞單數,收件未到件的快遞單數(一對多,一對一)
需求中設計到的字段說明(網點: scanNetworkCode : 快遞單號:waybillId )
-
框架和版本
- es-6.8 : 存儲,聚合數據
- flink-1.8 : 從mysql 和 mongo 中同步數據到es
-
方案一
-
說明
- 每種數據存儲到不同的索引,後一步數據更新前一步的數據
-
問題
- 數據同步過程,代碼強綁定,拓展性弱
- 簽收數據和 發件/到件 的唯一鍵不一致,無法更新
-
方案二
-
說明
- 所有數據存在同一個索引,以waybillId 作爲唯一鍵關聯每一條數據,以 Arrary 數據類型存儲 發/到
Array 官網學習資料: https://www.elastic.co/guide/en/elasticsearch/reference/6.8/array.html
-
數據同步問題
- 收/發 有多個,upsert只能覆蓋更新,怎麼新增並去重的更新 對應數組
方案1: 先查詢,然後把查詢結果和新數據合併成新的數組再插入
問題:查詢過程需要網絡請求和返回,比較耗時,沒有查詢過程,flink TPS可以達到 2w,反之則只有1000 TPS 左右
方案2: painless 腳本更新
SendBean bean = (SendBean) objData; Map<String, Object> map = new HashMap(); map.put("send", bean.toJSONObject()); map.put("scanNetworkCode", bean.getScanNetworkCode()); String scriptStr = "if (ctx._source.send == null) {ctx._source.send= []} def isCon=0;for(def i=0;i<ctx._source.send.length;i++){if(ctx._source.send[i].scanNetworkCode==params.scanNetworkCode){isCon=1}}if(isCon==0){ctx._source.send.add(params.send)}"; Script inline = new Script(ScriptType.INLINE, "painless", scriptStr, map); updateRequest.script(inline) ; indexer.add(updateRequest);
painless 官網學習資料:https://www.elastic.co/guide/en/elasticsearch/painless/6.8/painless-contexts.html
-
es 查詢問題
- 形成的索引信息
- 問題1: 過濾的時候,擴大了數據範圍
- 問題2:聚合的時候 ,擴大了數據聚合範圍
es Arrary和nested的區別: https://blog.csdn.net/laoyang360/article/details/82950393
方案三
-
說明
- 所有數據存在同一個索引,以waybillId 作爲唯一鍵關聯每一條數據,以 nested 數據類型存儲 發/到
nested 官網學習資料: https://www.elastic.co/guide/en/elasticsearch/reference/6.8/nested.html
-
es 查詢問題
- 形成的索引信息
問題1: 過濾的時候,擴大了數據範圍 (可以解決)
問題2: 聚合的時候 ,擴大了數據聚合範圍 (不能解決)
方案四(選擇方案)
-
說明
- 所有數據存在同一個索引;
- 以waybillId 作爲唯一鍵關聯 收 ,收件入庫,首發,派,問題件,留倉件,簽收 ; (parent)
- 以 waybillId+scanNetworkCode 作爲唯一索引,關聯發,到 ; (child)
- 以 join 數據格式 關聯 parent ,child
join 官網學習資料: https://www.elastic.co/guide/en/elasticsearch/reference/6.8/parent-join.html
-
es 查詢問題
- 生成的索引
- has_parent 查詢符合某些條件的父類的 子類 ,has_child 查詢符合某些條件的子類的父類,怎麼能查詢出查詢符合某些條件的子類的父類和子類
GET mongo_qc_dev/_search { "query": { "bool": { "should": [ { "has_child": { "type": "send", "query": { "match_all": {} } } }, { "match_all": {} } ] } }, "from": 0, "size": 1000 }
- 效率問題: es join 數據類型,has_parent 先查詢符合條件的子類,根據子類裏面的關係數據(父類和父類ID)再查找父類數據, 一次獨立查詢 < 效率 < 2次獨立查詢,雖然慢一點,但是比兩次獨立查詢快,所以不是性能瓶頸問題