`

Elasticsearch 数据建模 - 处理关联关系(1)

阅读更多

原文链接:http://blog.csdn.net/dm_vincent/article/details/47710367

 

 

数据建模(Modeling Your Data)

ES是一头不同寻常的野兽,尤其是当你来自SQL的世界时。它拥有很多优势:性能,可扩展性,准实时的搜索,以及对大数据的分析能力。并且,它很容易上手!只需要下载就能够开始使用它了。

但是它也不是魔法。为了更好的利用ES,你需要了解它从而让它能够满足你的需求。

在ES中,处理实体之间的关系并不像关系型存储那样明显。在关系数据库中的黄金准则 - 数据规范化,在ES中并不适用。在处理关联关系嵌套对象父子关联关系中,我们会讨论几种可行方案的优点和缺点。

紧接着在为可扩展性而设计中,我们会讨论ES提供的一些用来快速灵活实现扩展的特性。对于扩展,并没有一个可以适用于所有场景的解决方案。你需要考虑数据是如何在你的系统中流转的,从而恰当地对你的数据进行建模。针对基于时间的数据比如日志事件或者社交数据流的方案比相对静态的文档集合的方案是十分不同的。

最后,我们会讨论一样在ES中不会扩展的东西。


处理关联关系(Handling Relationships)

在真实的世界中,关联关系很重要:博客文章有评论,银行账户有交易,客户有银行账户,订单有行项目,目录也拥有文件和子目录。

在关系数据库中,处理关联关系的方式让你不会感到意外:

  • 每个实体(或者行,在关系世界中)可以通过一个主键唯一标识。
  • 实体是规范化了的。对于一个唯一的实体,它的数据仅被存储一次,而与之关联的实体则仅仅保存它的主键。改变一个实体的数据只能发生在一个地方。
  • 在查询期间,实体可以被联接(Join),它让跨实体查询成为可能。
  • 对于单个实体的修改是原子性,一致性,隔离性和持久性的。(参考ACID事务获取更多相关信息。)
  • 绝大多数的关系型数据库都支持针对多个实体的ACID事务。

但是关系型数据库也有它们的局限,除了在全文搜索领域它们拙劣的表现外。在查询期间联接实体是昂贵的 - 联接的实体越多,那么查询的代价就越大。对不同硬件上的实体执行联接操作的代价太大以至于它甚至是不切实际的。这就为在单个服务器上能够存储的数据量设下了一个限制。

ES,像多数NoSQL数据库那样,将世界看作是平的。一个索引就是一系列独立文档的扁平集合。一个单一的文档应该包括用来判断它是否符合一个搜索请求的所有信息。

虽然在ES中改变一份文档的数据是符合ACIDic的,涉及到多份文档的事务就不然了。在ES中,当事务失败后是没有办法将索引回滚到它之前的状态的。

这个扁平化的世界有它的优势:

  • 索引是迅速且不需要上锁的。
  • 搜索是迅速且不需要上锁的。
  • 大规模的数据可以被分布到多个节点上,因为每份文档之间是独立的。

但是关联关系很重要。我们需要以某种方式将扁平化的世界和真实的世界连接起来。在ES中,有4中常用的技术来管理关联数据:

通常最终的解决方案会结合这些方案的几种。


应用端联接(Application-side Joins)

我们可以通过在应用中实现联接来(部分)模拟一个关系型数据库。比如,当我们想要索引用户和他们的博客文章时。在关系型的世界中,我们可以这样做:

PUT /my_index/user/1  (1)
{
  "name":     "John Smith",
  "email":    "john@smith.com",
  "dob":      "1970/10/24"
}

PUT /my_index/blogpost/2   (2)
{
  "title":    "Relationships",
  "body":     "It's complicated...",
  "user":     1   (3)
}

(1)(2) 索引,类型以及每份文档的ID一起构成了主键。

(3) 博文通过保存了用户的ID来联接到用户。由于索引和类型是被硬编码到了应用中的,所以这里并不需要。

通过用户ID等于1来找到对应的博文很容易:

GET /my_index/blogpost/_search
{
  "query": {
    "filtered": {
      "filter": {
        "term": { "user": 1 }
      }
    }
  }
}

为了找到用户John的博文,我们可以执行两条查询:第一条查询用来得到所有名为John的用户的IDs,第二条查询通过这些IDs来得到对应文章:

GET /my_index/user/_search
{
  "query": {
    "match": {
      "name": "John"
    }
  }
}

GET /my_index/blogpost/_search
{
  "query": {
    "filtered": {
      "filter": {
        "terms": { "user": [1] }   (1)
      }
    }
  }
}

(1) 传入到terms过滤器的值是第一条查询的结果。

应用端联接最大的优势在于数据是规范化了的。改变用户的名字只需要在一个地方操作:用户对应的文档。劣势在于你需要在搜索期间运行额外的查询来联接文档。

在这个例子中,只有一位用户匹配了第一条查询,但是在实际应用中可能轻易就得到了数以百万计的名为John的用户。将所有的IDs传入到第二个查询中会让该查询非常巨大,它需要执行百万计的term查询。

这种方法在第一个实体的文档数量较小并且它们很少改变时合适(这个例子中实体指的是用户)。这就使得通过缓存结果来避免频繁查询成为可能。


反规范化你的数据(Denormalizing Your Data)

让ES达到最好的搜索性能的方法是采用更直接的办法,通过在索引期间反规范化你的数据。通过在每份文档中包含冗余数据来避免联接。

如果我们需要通过作者的名字来搜索博文,可以在博文对应的文档中直接包含该作者的名字:

PUT /my_index/user/1
{
  "name":     "John Smith",
  "email":    "john@smith.com",
  "dob":      "1970/10/24"
}

PUT /my_index/blogpost/2
{
  "title":    "Relationships",
  "body":     "It's complicated...",
  "user":     {
    "id":       1,
    "name":     "John Smith" 
  }
}

现在,我们可以通过一条查询来得到用户名为John的博文了:

GET /my_index/blogpost/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "title":     "relationships" }},
        { "match": { "user.name": "John"          }}
      ]
    }
  }
}

对数据的反规范化的优势在于速度。因为每份文档包含了用于判断是否匹配查询的所有数据,不需要执行代价高昂的联接操作。

分享到:
评论

相关推荐

    Elasticsearch权威指南基础入门

    Shay Banon在前言中强调了Elasticsearch在数据分析和搜索方面的重要性,其能力不仅仅局限于全文搜索,还涵盖了结构化搜索、数据分析、语言处理、地理位置以及对象间关联关系等领域。 Elasticsearch的分布式和可扩展...

    pdman免费好用的数据建模工具

    【PDMan:免费高效的数据建模利器】 PDMan是一款专为数据库建模设计的免费软件,它以简洁易用的特点赢得了广大用户的喜爱。在IT行业中,数据建模是数据库设计的关键步骤,它帮助我们理解、定义和组织数据,确保系统...

    ES高手进阶篇part2

    【ES高手进阶篇part2】是针对Elasticsearch(ES)高级用户的系列教程,涵盖了多个关键主题,旨在提升用户对ES的深度理解和应用能力。本篇内容主要围绕中文分词、数据建模实战和深入聚合数据分析展开,下面将详细阐述...

    Elasticsearch权威指南(中文版)

    Elasticsearch 是一个分布式、可扩展、实时的搜索与数据分析引擎。 它能从项目一开始就赋予 ... 我们还将探讨如何给数据建模来充分利用 Elasticsearch 的水 平伸缩性,以及在生产环境中如何配置和监视你的集群

    基于Neo4j和elasticsearch的知识图谱搜索查询

    总结来说,"基于Neo4j和Elasticsearch的知识图谱搜索查询"是将结构化与非结构化的数据融合,利用图形数据库的强大关系处理能力和全文搜索引擎的高效检索特性,共同构建出一个更智能、更个性化的搜索系统。...

    数据库分析与设计及建模方法

    1. **数据表拆分:**将职员表和技能表分开存储,利用第三张表(如职员技能关联表)来记录两者之间的多对多关系。 - **职员表**:`personId`, `Name` - **技能表**:`skillId`, `skillName` - **职员技能表**:`...

    opengles3-book_opengl/计算机图像学/渲染_OpenGLES_

    4. 绑定和启用顶点属性:将缓冲区数据与着色器输入关联。 5. 渲染:调用`glDrawArrays`或`glDrawElements`进行绘制。 6. 清除和交换缓冲区:清除屏幕,准备下一次渲染。 四、3D图形构建 3D图形的构建涉及网格建模...

    数据治理服务解决方案及应用案例qy.pptx

    - 强调融合的数据基础平台,包括数仓系统、大数据平台和其他工具,如时间序列数据库(TSDB)、Elasticsearch(ES)、Redis等。 - 重点在于增强数据治理、数据建模与处理、数据服务和数据管控能力。 - **目标**: - ...

    【数学建模】2021华为杯D题解题思路.docx

    1. 数据标准化处理:在使用机器学习算法时,我们需要对数据进行标准化处理,以确保算法的结果是可靠的。 2. 算法选择:我们需要选择合适的机器学习算法来解决不同的问题。 3. 数据质量:我们需要确保数据的质量,以...

    基于python的大数据反电信诈骗管理系统源码数据库.zip

    同时,可能还使用了Elasticsearch或Kafka等工具进行实时数据流处理,及时发现和响应诈骗行为。 系统设计可能包括以下几个核心模块: 1. 数据采集:收集电话通话记录、银行交易、社交媒体等多源数据。 2. 数据预处理...

    SAP ES 公有云开发-自定义CDS视图并发布到磁贴

    总的来说,SAP ES公有云开发中的CDS视图和磁贴发布是一个集数据建模、查询设计、应用程序创建和用户体验优化于一体的流程。通过这种方式,开发者可以构建出符合业务需求的个性化数据展示,而用户则能在一个直观且...

    水利自动化实时流式大数据的处理研究.docx

    告警信息通过消息系统发送,实时数据存储在Elasticsearch数据库中以供快速检索,复杂的业务数据则由SparkStreaming进行集群运算,最终结果保存在时序数据库和关系数据库中。 为了解决现代水利工程自动化系统的问题...

    kibana 示例数据.rar

    这样的文本数据集在数据科学中常用于自然语言处理(NLP)任务,如情感分析、主题建模或词频统计。在Kibana中,可以创建新的索引模式,将这些文本数据导入,并利用Kibana的分析工具对莎士比亚作品中的词汇、角色、...

    Estudo-de-MLG-para-dados-de-dengue:对有登革热通知感兴趣的ES市镇的2013年数据建模

    1. 数据获取:收集有关登革热病例、气象数据、地理位置等多元信息。 2. 数据预处理:清理异常值,处理缺失数据,可能还需要将时间数据转换为适合分析的格式。 3. 特征工程:识别与登革热通报相关的潜在影响因素,如...

    Titan图数据库安装文件

    - 它提供了对多种后端存储的支持,如Cassandra、HBase和BerkeleyDB,以及索引服务如Elasticsearch和Solr。 - Titan支持TinkerPop框架,这是一个开源的图形计算栈,提供了一组标准的API和工具,简化了图形数据库的...

    方正平台_进销管理系统数据字典_java快速开发平台_web快速开发平台

    ### 方正飞鸿智能信息平台(Fix ES2007)概述...此外,结合方正飞鸿智能信息平台(Fix ES2007)的技术特点,我们可以进一步认识到该平台如何通过强大的数据建模能力和业务逻辑扩展能力来支撑企业的日常运营和管理需求。

    基于SARIMA-BP神经网络方法的汽车销量预测研究.pdf

    基于SARIMA-BP神经网络方法的汽车销量预测研究 本研究论文旨在探讨基于SARIMA-BP神经网络方法的汽车销量预测问题,并对汽车销量...常见的数据建模方法包括SARIMA模型、ARIMA模型和Exponential Smoothing(ES)模型等。

    医学大数据分析PPT.zip

    2. **第2章 常用大数据工具**:讲解了医疗领域中常用的大数据处理工具,如Hadoop、Spark、HBase等分布式计算框架,以及Elasticsearch、Hive等数据存储和查询工具,强调了这些工具在处理大规模医学数据时的作用。...

    flink工程-权益发放实时分析框架

    本工程主要关注的是如何利用Flink构建一个权益发放的实时分析框架,这涉及到多个关键知识点,包括Flink的核心概念、实时数据处理流程、以及如何结合业务需求进行数据建模和分析。 首先,我们需要理解Flink的基本...

Global site tag (gtag.js) - Google Analytics