表与表之间的关联基本上是所有业务系统都存在的,RDBMS通过外键实现,MongoDB通过嵌入式子文档解决,那么Elasticsearch怎么解决这个问题呢?答案就是Parent-Child关联(参考文档)

业务场景

有一个广告的分发系统,为了更精准的做广告的推送,除了自身积累的数据以外,还会从其他合作方通过数据交换(当然这些都是脱敏的数据)的方式获取更多用户行为数据,例如从音乐网站获取听的音乐列表、从购物网站获取最近的购物类别、从书评网站获取最近浏览的图书等等。这些来自于外部的数据,有以下几个问题:

  1. 并不是每个用户都有全部的数据,比如有些用户只有书评和音乐信息,而有些用户没有任何外部信息
  2. 某一类外部的数据源可能包含几个网站,比如音乐网站有A、B、C三个网站,它们提供的数据格式也并不一致

在进行广告推送时,需要实时查询一个用户的信息完成精准推荐。比如实时查询满足下面条件的用户:

  • 最近一个月,
  • 经常在早上、傍晚或者晚上连续一个小时的音乐;
  • 购买过跑鞋、运动手表等跑步装备
  • 且购买过或点评过运动类书籍

再继续下面的(十分简化)解决方案之前,可以先思考下

解决方案

这是典型应用大数据进行个性化精准推荐的应用场景,在省却了数据清洗、评分等各种步骤以后,简化为一个查询问题。分析可以发现数据问题的核心就是:无固定表结构,是典型的Schema-Free的NoSQL应用场景,第一个反应出来的就是MongoDB。

MongoDB

MongoDB用作以上的数据存储,毫无疑问具有天然的优势,可以将每个来源的数据都作为user的一个子文档存储,查询时也只是在这一个Collection上进行(可能有人会说这种方案太蠢了,的确是,不过也要看产品所处的阶段)。当然这样做的问题也显而易见:
为了查询速度,索引是必须要创建的。可是因为数据源不断变化,那么索引的维护就会变成一个灾难。一旦忘记创建查询,可能就会拖死整个系统。

下面当然就是主角上场了。

Elasticsearch

定调:
1. 由于字段是变化,因此必须使用动态Mapping(文档)
2. 由于Parent-Child的关系需要创建索引(Create Index)时就确定,因此必须使用固定的Mapping(文档)

我又检查了上面两条,的确是没有说错。

其实很简单,在创建索引时,只需指定父子关系,无需指定其他未知字段。因为要预先指定type的父子关系,所以就必须先确定type。这是用两个type:user和user_action,那么创建索引时的Mapping大致如下:

{"mappings": {"user": {},"user_action": {"_parent" : {"type": "user"}}}
}

我好像把文档中的例子抄了一遍,不多实际情况的确是这样。

那么在添加文档到索引中时,对于user就需要指定id,而user_action需要指定parent,例如:

es = Elasticsearch()_id = 27
_user = {'id': 27,'name': 'Tigger Fei'
}# 索引用户文档
es.index(index='user_index', doc_type='user', id=str(_id), body=_user)# 索引用户行为文档, type字段表示列表
# 音乐
_music = {'type': 'music','user': 27,'period': 'morning','duration': 78,'category': 'running','time': '2017-01-29 12:30:00'
}
es.index(index='user_index', doc_type='user_action', parent=str(_id), body=_music)
# 图书,
_book = {'type': 'book,''user': 27,'name': '我的第一个马拉松','category': 'running','time': '2017-01-30 12:30:00'
}
es.index(index='user_index', doc_type='user_action', parent=str(_id), body=_book)

如何完成上面的查询呢,如下:

POST user_index/user/_search
{"query": {"bool": {"filter": [{"has_child": {"type": "user_action","query": { "bool": { "filter": [{"term": {"type": "music"}},{"range": {"duration": {"gte": 60}}},{"range": {"time": {"gte": "2017-01-07 00:00:00","format": "yyyy-MM-dd HH:mm:ss"}}},{"term": {"category": "running"}},{"terms": {"period": ["morning", "night"]}}]}}}},{"has_child": {"type": "user_action","query": { "bool": { "filter": [{"range": {"time": {"gte": "2017-01-07 00:00:00","format": "yyyy-MM-dd HH:mm:ss"}}},{"term": {"type": "book"}},{"term": {"category": "running"}}]}}}}]}}
}

好了,这个简单的解决方案就完了。

Elasticsearch——利用Parent-Child关系解决大数据场景下的实时查询相关推荐

  1. 开源实践 | OceanBase 在红象云腾大数据场景下的实践与思考

    本文将介绍 OceanBase 在红象云腾大数据场景下的落地实践与思考,希望帮助正在探索 OceanBase 的企业用户快速实现 OceanBase 选型与落地. 作者:童小军 红象云腾 (REDOO ...

  2. 秒懂大数据场景下等级保护2.0新要求

    随着GB/T 22239-2019<信息安全技术 网络安全等级保护基本要求>的发布,大家不断关注等级保护2.0 的变化和合规难度. 下面笔者通过一张思维导图,梳理了大数据场景下的等级保护新 ...

  3. 一招教你解决大数据量下的各种报表使用问题

    在我们日常制作报表分析过程中,总会遇到各种问题.比如,报表底层数据日益增多.报表加载超慢,这些情况该怎么解决? 数据库是最常见的能处理大数据的计算方案,而永洪能利用数据库来完成数据计算.但是,有些报表 ...

  4. 大数据场景下Volcano高效调度能力实践

    摘要:本篇文章将会从Spark on Kubernetes 发展历程以及工作原理,以及介绍一下Spark with Volcano,Volcano如何能够帮助 Spark运行地更高效. Spark o ...

  5. 大数据场景下多源异构数据的实时处理分析

    随着大数据应用的发展,人们对实时数据的要求越来越高,大数据也逐渐从最初的离线数据仓库架构发展到Labmda架构,实现了离线实时更新的目标.到后来的Kappa体系结构中,Labmda体系结构的实时部分被 ...

  6. 数据湖在大数据场景下应用和实施方案调研笔记(增强版)

    点击上方蓝色字体,选择"设为星标" 回复"面试"获取更多惊喜 在读本文前你应该看过这些: <我看好数据湖的未来,但不看好数据湖的现在> <数据 ...

  7. 大数据量下 PageHelper 分页查询性能问题的解决办法

    作者:岁月安然 blog.csdn.net/baidu_38083619/article/details/82463058 前因 项目一直使用的是PageHelper实现分页功能,项目前期数据量较少一 ...

  8. elasticsearch 大数据场景下使用scroll实现分页查询

    es查询大批量数据的"可能方案" 当使用es来请求大批量数据时,通常有三种办法,其一:直接查询获取全量数据:其二:使用setFrom以及setSize解决:其三:使用es自带的sc ...

  9. 大数据技术下 分布式数据库何去何从?

    转自:安华信达的文章 链接地址:http://www.sohu.com/a/133784835_481676 一.大数据技术的发展 大数据技术从诞生到现在,已历经了十几个年头,市场上也早已有公司或机构 ...

最新文章

  1. 从源码角度看Android系统Zygote进程启动过程
  2. UScript中的Pow函数
  3. jzoj4208-线段树什么的最讨厌了【dfs】
  4. Makefile的介绍与使用
  5. java 参数类型不确定_java泛型的那些事
  6. MS SQL 语句中的字符串连接
  7. 《Optimized Risk Scores》论文附带代码运行记录
  8. CUPS搜索添加打印机的范例代码
  9. 《Python语言程序设计》二级教程课后编程题及答案
  10. tcpdump抓取无效TCP标志数据包表达式
  11. 科来网络分析系统与数据包分析
  12. 10分钟也不一定学会的灵敏度分析
  13. 计算机将会代替老师吗英语范文,英文作文电脑对教育的重要意义
  14. Dbviusalizer报错Java.lang.ClassCastException: javax.swing.KeyStroke cannot be cast to java.lang.Compar
  15. 无序列表前小黑点图片替换方法
  16. 夜神模拟器只有android5怎么办,夜神安卓模拟器很卡怎么办 夜神模拟器好卡解决方法...
  17. 文字转语音文件现成工具
  18. 订单可视化(智能制造、流程再造、企业信息化) 第二篇 背景及问题提出
  19. 红帽RHCE考试要注意的几点
  20. MySQL学习总结(一)DB、DMBS、SQL的含义/MySQL语法规范

热门文章

  1. 单调队列以及单调队列优化DP
  2. WPF仿制IOS UI(未完待续)
  3. monkey 真机测试步骤
  4. 使用 IntraWeb (39) - THttpRequest、THttpReply
  5. Solaris 的防火墙ipfilter设置
  6. Python使用BeautifulSoup爬取网页中主体部分的内容,并导出为pdf格式
  7. idea项目application.properties文件注释显示unicode编码
  8. linux内核部件分析(十)——设备驱动模型之class,linux内核部件分析(十)——设备驱动模型之class...
  9. html游戏图标库,又一款开源图标库 CSS.GG,值得一用
  10. radius mysql md5_请教两个问题:关于无线局域网和Radius+MD5认证