「疯牛秘籍开设技术专栏啦」
打造量化交易体系是一个涉及多类型技术的综合性技术工作。为解决小伙伴们在打造量化交易系统过程中的实际问题,小编以后每周都会为大家精选一篇疯牛秘籍技术团队实操过程的原创技术干货文章,希望给粉丝们在量化投资的征程中输送更多能量!
表与表之间的关联基本上是所有业务系统都存在的,RDBMS通过外键实现,MongoDB通过嵌入式子文档解决,那么Elasticsearch怎么解决这个问题呢?
答案就是Parent-Child关联
一
业务场景
有一个广告的分发系统,为了更精准的做广告的推送,除了自身积累的数据以外,还会从其他合作方通过数据交换(当然这些都是脱敏的数据)的方式获取更多用户行为数据,例如从音乐网站获取听的音乐列表、从购物网站获取最近的购物类别、从书评网站获取最近浏览的图书等等。这些来自于外部的数据,有以下几个问题:
1.并不是每个用户都有全部的数据,比如有些用户只有书评和音乐信息,而有些用户没有任何外部信息
2.某一类外部的数据源可能包含几个网站,比如音乐网站有A、B、C三个网站,它们提供的数据格式也并不一致
在进行广告推送时,需要实时查询一个用户的信息完成精准推荐。比如实时查询满足下面条件的用户:
最近一个月
经常在早上、傍晚或者晚上连续一个小时的音乐
购买过跑鞋、运动手表等跑步装备
且购买过或点评过运动类书籍
Ps:再继续下面的(十分简化)解决方案之前,可以先思考下
二
解决方案
这是典型应用大数据进行个性化精准推荐的应用场景,在省却了数据清洗、评分等各种步骤以后,简化为一个查询问题。分析可以发现数据问题的核心就是:无固定表结构,是典型的Schema-Free的NoSQL应用场景,第一个反应出来的就是MongoDB。
MongoDB
MongoDB用作以上的数据存储,毫无疑问具有天然的优势,可以将每个来源的数据都作为user的一个子文档存储,查询时也只是在这一个Collection上进行(可能有人会说这种方案太蠢了,的确是,不过也要看产品所处的阶段)。当然这样做的问题也显而易见:
为了查询速度,索引是必须要创建的。可是因为数据源不断变化,那么索引的维护就会变成一个灾难。一旦忘记创建查询,可能就会拖死整个系统。
下面当然就是主角上场了。
Elasticsearch
定调:
1. 由于字段是变化的,因此必须使用动态Mapping
2. 由于Parent-Child的关系需要创建索引(Create Index)时就确定,因此必须使用固定的Mapping
我又检查了上面两条,的确是没有说错。
其实很简单,在创建索引时,只需指定父子关系,无需指定其他未知字段。因为要预先指定type的父子关系,所以就必须先确定type。这是用两个type:user和user_action,那么创建索引时的Mapping大致如下:
我好像把文档中的例子抄了一遍,不过实际情况的确是这样。
那么在添加文档到索引中时,对于user就需要指定id,而user_action需要指定parent,例如:
如何完成上面的查询呢,如下:
好了,这个简单的解决方案就完成了。
疯牛秘籍不光有精彩盘评,还有技术干货文章,喜欢的话欢迎留言转发!关注量化交易体系的朋友请往下看,量化交易体系实战系列课程等你来参加哟!
牛老师说
领取专属 10元无门槛券
私享最新 技术干货