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

表与表之间的关联基本上是所有业务系统都存在的,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"}}
                ]
              }
            }
          }
        }
      ]
    }
  }
}

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

时间: 2024-07-29 00:09:33

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

大数据量下的数据库查询与插入如何优化? (整理)

数据库经常要做一些查询与插入,但是如果查询和插入的数据量过大的时候就会引发数据库性能问题,降低数据库工作效率.因此性能调优是大家在工作中都能够预见的问题,大到世界五百强的核心系统,小到超市的库存系统,几乎都会有要调优的时候.面对形形色色的系统,林林总总的需求,调优的手段也是丰富多彩. 1.尽量使语句符合查询优化器的规则避免全表扫描而使用索引查询 2.避免频繁创建和删除临时表,以减少系统表资源的消耗. 3.尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理. 4.建立高效的索引

mysql-利用MySQL数据库如何解决大数据量存储问题?

问题描述 利用MySQL数据库如何解决大数据量存储问题? 各位高手您们好,我最近接手公司里一个比较棘手的问题,关于如何利用MySQL存储大数据量的问题,主要是数据库中的两张历史数据表,一张模拟量历史数据和一张开关量历史数据表,这两张表字段设计的很简单(OrderNo,Value,DataTime).基本上每张表每天可以增加几千万条数据,我想问如何存储数据才能不影响检索速度呢?需不需要换oracle数据库呢?因为我是数据库方面的新手,希望可以说的详细一点,万分感谢!!! 解决方案 查询业务是怎么样

2016中国国际大数据大会:大数据时代下的机遇和挑战

ZD至顶网CIO与应用频道 10月09日 北京消息:十一假期前,一年一届的中国国际大数据大会在京闭幕.本届由人民邮电出版社主办,<大数据>杂志.数创汇承办的大会,以"数聚新动能.数创大未来"为题,共同探讨了大数据的发展态势,以及技术如何与行业紧密融合. 以下为嘉宾精彩观点整理: 国家信息化专家咨询委员会常务副主任周宏仁:中国GDP不能靠房产,数据资产是条路子 因为大数据产业的绿色.高效.门槛相对也比较低,所以是最具有潜力的新兴产业之一.但要想发展一个数据企业的话,实际上有三

大数据背景下知识产权侵权行为网络异化与解决思路 —— 以著作权间接侵权为视角

一.大数据对知识产权的影响 (一)大数据对于知识产权的促进作用 互联网的发展壮大为智力成果的传播提供了一个全新的方式,即网络传播方式.相对于传统传播方式,网络传播方式几乎为零成本,因此,网络技术的出现,不但改变了人类的生活方式和社会经济发展模式,而且对当代各国的法律制度提出了挑战.正是在这个意义上,人们赋予知识产权制度以鲜明的时代技术特征,将其称为"网络知识产权".[1]所以,知识产权客体的无形性与网络空间的虚拟性具有一种天然的契合性,这种天然的契合性对于知识产权的发展有极大的促进作用

小数据:解决大数据难题的“良药”

当前,随着大数据日渐炙手可热,大数据的应用也在逐渐深入,然而,围绕大数据的争论却从未停止过,依然非常激烈.其中一个原因就是,尽管前景美好.潜力巨大,但在"大体量"数据利用及实现商业价值的过程中往往充满挑战.非常棘手. 如首先,需要强大的机器和经验丰富的数据科学家将原始信息及庞大数据转化为洞察力.在这个过程中,如何去分配正确资源,并跨部门和学科去释义这些信息都非常困难.而当我们从数据中抽离出洞察见解之后,下一步该如何去利用这些洞察也一样充满困惑. 那么,在目前阶段,该怎么办呢?笔者认为解

同构关系:大数据的数理哲学基础

过去,人们认为人类与动物区别于劳动.但实际上,动物也有作用于物质世界的类似劳动的活动.因此,如何看待数据才是是否拥有智力的本质特征只有人类才能认识事物的数与结构关系,并定量地.合目的地作用于对象. 在极其遥远的远古时候,占卜吉凶,预测未来,就是人类强烈的愿望,而实现的途径离不开数据.易经.八卦这一类占卜吉凶的工具,就是一种透露世界万事万物运行盛衰信息的载体,它本身既存在于现实中,也必然与世界其他所有事物遵循同一时空关系,与世界事物变化具有同构关系.例如相互依存.物极必反.量变质变.过犹不及.柔弱

企业CIO解决大数据挑战 先回答三个问题

当今,大数据的到来,已经成为现实生活中无法逃避的挑战.每当我们要做出决策的时候,大数据就无处不在.大数据术语广泛地出现也使得人们渐渐明白了它的重要性.大数据渐渐向人们展现了它为学术.工业和政府带来的巨大机遇.与此同时,大数据也向参与的各方提出了巨大的挑战,首先是三个重要的技术问题: 一.如何利用信息技术等手段处理非结构化和半结构化数据 大数据中,结构化数据只占15%左右,其余的85%都是非结构化的数据,它们大量存在于社交网络.互联网和电子商务等领域.另一方面,也许有90%的数据来自开源数据,其余

倪光南:利用分层思路深挖大数据价值

中国工程院院士倪光南 在"2013中国国际http://www.aliyun.com/zixun/aggregation/13422.html">云计算技术和应用展览会暨研讨会"上,中国工程院院士倪光南指出,如果说大数据是座蕴含大价值的矿藏,云计算则可看作是采矿作业的得力工具. 倪光南强调,云计算也是为解决大数据等"大问题"而发展而来的技术趋势,没有大数据需求,云计算功用也将得不到完全发挥.因此,大数据与云计算是相辅相成的. 对大数据而言,倪光南表示

解决大数据挑战先回答三个问题

当今,大数据的到来,已经成为现实生活中无法逃避的挑战.每当我们要做出决策的时候,大数据就无处不在.大数据术语广泛地出现也使得人们渐渐明白了它的重要性.大数据渐渐向人们展现了它为学术.工业和政府带来的巨大机遇.与此同时,大数据也向参与的各方提出了巨大的挑战,首先是三个重要的技术问题:一.如何利用信息技术等手段处理非结构化和半结构化数据大数据中,结构化数据只占15%左右,其余的85%都是非结构化的数据,它们大量存在于社交网络.互联网和电子商务等领域.另一方面,也许有90%的数据来自开源数据,其余的被