0、需求
针对凤凰网财经版块的新闻数据和评论数据, 1个索引存储采集凤凰网财经版块的新闻数据;1个索引存储相关的财经数据评论结果。
统计:
1)某条新闻的评论数的多少?
2)某条评论属于哪条新闻?
3)当前已采集数据的所有评论、评论数汇总,按照评论数逆序排序,以便于图形化展示。
1、问题分解
1.1 数据如何存储,方案选型?
方案一:类似需求,1个索引ifeng_index存储新闻数据;1个索引ifeng_comm_index存储评论数据。
二者之间通过唯一值建立关联:评论数据中其来源新闻的唯一id值。
优点:数据分开存储,不存在交叉问题;
缺点:如果实现需求3),会非常复杂,做全局两通道的遍历和统计。
方案二:借助2.X-5.X版本ES中特有的父子文档实现。
注意:由于6.X版本以后,一个索引下只能存储一个type,所以父子文档也就不再可以使用。
所谓父子文档,可以理解为:
1)统一索引下的两个type,1个父type存储凤凰网新闻数据;1个子type存储凤凰网评论数据;
2)其中子type的Mapping定义要特殊处理;
3)其中子type的每条凤凰网评论数据都要关联唯一的父type的相关ID值。
优点:可以以相对较小的复杂度满足需求1)、2)、3)
缺点:以上方案二,ES6.X+都不再适用。
注意:
ES6.X已经移除父子文档的相关实现:http://t.cn/RE07V5A
但是转换为新的join的实现方式:http://t.cn/RE07IG1
综上分析,我是5.X的版本,采取方案二。
1.2 所需要技术支撑
1)父子文档技术
父子文档定义:
用于两个索引之间通过某一个特殊字段建立关联的场景。
在1对多的场景,尤其适用。如:1个父文档下有多个子文档。
缺点: 查询速度会比同等的嵌套查询慢5到10倍,详见:http://t.cn/ROir5rQ
父子文档实现:
建立父-子文档映射关系时只需要指定某一个文档 type 是另一个文档 type 的父亲。 该关系可以在如下两个时间点设置:1)创建索引时;2)在子文档 type 创建之前更新父文档的 mapping。
2)全局遍历技术
借助Scroll实现。之前的博文也有说明,http://t.cn/RE068mD
【scroll机制】:相对于fro