快递质量监控实时统计方案设计

mac2026-04-25  10

目录

 

数据流程图和关系

数据流程图

 数据流程关系   

需求描述

框架和版本

方案一

说明

问题

方案二

说明

数据同步问题

es 查询问题

方案三

说明

es 查询问题

方案四(选择方案)

说明

es 查询问题 


数据流程图和关系

 

数据流程图

 数据流程关系   

 一对一:  收 ,收件入库,派,问题件,留仓件,签收 ; 发  到  一对多(多对一):   收(收件入库,派,问题件,留仓件,签收 )  和  发 (到) 

需求描述

实时统计 每个网点,每天 发件未到件,发件未签收的快递单数(一对一,多对一)实时统计  每个网点,每天 收件 未发件的快递单数,收件未到件的快递单数(一对多,一对一)

     需求中设计到的字段说明(网点: 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次独立查询,虽然慢一点,但是比两次独立查询快,所以不是性能瓶颈问题 

 

最新回复(0)