Elasticsearch 使用误区之一——将 Elasticsearch 视为关系数据库!

news2024/11/16 1:28:29

Elasticsearch 是一个强大的工具,尤其在全文检索、实时分析、机器学习、地理数据应用、日志和事件数据分析、安全信息和事件管理等场景有大量的应用。

然而,Elastic Stack 技术栈的选型及应用效能取决于正确的使用方式。选型错误或者误用 Elasticsearch 可能会导致扩展性问题、性能问题(如为解决一个问题使用非常复杂的脚本导致性能极差)等,从而使整体体验感变差。所以,本文区别于之前的正向讲解的方式,更多的讲解反例或者负面应用案例。“以史为鉴”,以便于大家更好地使用 Elasticsearch。

本系列文章会有 10 几篇左右,一篇一个知识点讲解 Elasticsearch 使用误区解读,敬请期待!

误区1:将 Elasticsearch 视为关系数据库

Elasticsearch 常被误解为 MySQL 或者 PostgreSQL 等关系数据库的直接替代品,用户除了直接替代使用外更看其全文搜索和快速聚合的能力。

然而,咱们必须清晰的认知:Elasticsearch 设计初衷不是处理复杂事务和关系数据模型的。

我们从下面几个维度逐一展开讨论:

1、该不该选型 Elasticsearch ?

276255d0a1e9ec6b9cf84e021d907775.png

个人建议先了解 Elasticsearch 的适用场景以及不适用场景,这样能清楚 Elastic Stack 技术栈更适合哪些业务需求。

例如,咱们文章之前图解的六大应用场景是非常适合的。然而,对于需要处理复杂事务、多表联查操作和高一致性要求的应用,如银行系统的交易处理和ERP系统等,Elasticsearch 则不太适合。

6ac65fcee44127a3d2cf584fa3f2ff15.png

Elasticsearch 更适用场景:

ddaca5538f177b52179eeeafa537394a.png

d6bea30eab0aea327eed0635504b5e22.png

1c88ba0529cd8f899a4d6aa0bd6965ac.png

通过对比这些场景,反观自己的业务需求,就能判断是否应该选型 Elasticsearch 甚至 Elastic Stack 作为技术栈。

2、理解 Elasticsearch 的设计

4e9a2aed5c6d34401fbc233b2476a90f.png

图片来自官方博客

Elasticsearch 是一种面向文档的搜索引擎,专为快速搜索大量数据而设计。

Elasticsearch 基于 Apache Lucene 构建,提供了强大的全文搜索、分析和数据聚合功能。

以下是 Elasticsearch 的主要特点:

  • 全文搜索:Elasticsearch 提供了高效的全文搜索功能,能够快速检索和匹配大规模文本数据。

  • 分布式架构:Elasticsearch 采用分布式架构,能够水平横向扩展,处理海量数据(PB级甚至以上都不是问题)和高并发请求。

  • 数据分析:Elasticsearch 支持复杂的聚合查询,可以做多维度的快速统计和分析数据,但聚合、去重等结果不是精准的。有精准需求的企业场景也要评估和掂量一下。

  • ......

60f3e328e49d2d66c48d9f9ceda37318.png

图片来自官方博客

如前所述,Elasticsearch 并不是设计用来处理关系数据和事务的。它的主要优势在于分析和搜索能力,而不是数据关系的严格维护。

3、理解 Elasticsearch 与关系数据库的比较

关系数据库(如 MySQL、Oracle 及 PostgreSQL 等)和 Elasticsearch 之间有几个关键区别:

3.1 数据模型比较

  • 关系数据库使用结构化的表和行来存储数据,并通过外键和约束来维护数据的一致性。

  • Elasticsearch 则使用文档(document,本质是 JSON 格式)来存储数据,每个文档可以包含不同的字段和数据类型。

特性关系数据库Elasticsearch
数据存储结构结构化的表和行文档
数据类型每个表的字段类型固定每个文档可以包含不同的字段和数据类型
数据一致性通过外键和约束来维护数据的一致性不提供数据一致性保障
查询能力支持复杂的 SQL 查询、事务和联接操作主要用于全文搜索和数据聚合
事务支持完整的事务支持不支持事务
性能优化索引、缓存和查询优化分片、索引和缓存
主要优势关系数据处理和数据一致性维护快速搜索和高效的数据聚合

3.2 查询能力比较

  • 关系数据库支持复杂的 SQL 查询、事务和多表关联操作,以保证数据的一致性和完整性。

  • Elasticsearch 主要侧重于全文搜索和数据聚合,不支持复杂的事务和多表关联操作。

在关系数据库中,我们可以使用复杂的 SQL 查询、事务和多表关联操作来保证数据的一致性和完整性。例如:

BEGIN TRANSACTION;

-- 更新订单状态
UPDATE orders
SET status = 'shipped'
WHERE order_id = 123;

-- 减少库存
UPDATE products
SET stock = stock - 1
WHERE product_id = 456;

-- 记录客户活动
INSERT INTO customer_activity (customer_id, activity)
VALUES (789, 'Order 123 shipped');

COMMIT;

6e46a43f82d59ec1a60c01de5f662cc8.png

上述事务示例能确保所有相关操作(更新订单状态、减少库存和记录客户活动)要么全部成功,要么全部失败,从而保证数据的一致性(事务的本质)。

在 Elasticsearch 中,我们主要侧重于全文搜索和数据聚合分析,而不支持复杂的事务和多表关联操作。

比如:用户需求如下:

“想请教下大佬们,假设 es 中 有两个表,一个会员表,一个订单表,如果想关联查询,例如查询24年注册的所有的会员的订单总数,通过什么方式能快速查询?”

咱们文章做过剖析,Elasticsearch 不是一丁点也不支持多表关联,只是支持的力度有限,支持的形式核心有如下几种:

  • 自己业务层面实现

  • Nested 嵌套数据类型

  • Join 父子文档类型

  • 宽表冗余存储

  • Enrich processor 预处理方式

更深入关于多表关联的探讨,官方 2013 年的博文就已经说过,建议阅读:

https://www.elastic.co/cn/blog/managing-relations-inside-elasticsearch

《一本书讲透 Elasticsearch》第77-95页也有过深入的解读和探讨。

Elasticsearch 真正擅长的还是检索和数据统计聚合分析,如下所示:

GET /products/_search
{
  "query": {
    "multi_match": {
      "query": "laptop",
      "fields": ["name", "description"]
    }
  },
  "aggs": {
    "average_price": {
      "avg": {
        "field": "price"
      }
    }
  }
}

我们搜索产品名称和描述中包含“laptop”的文档,并计算这些产品的平均价格。这种查询主要用于快速检索和聚合数据,而不涉及复杂的事务和多表关联操作。

3.3性能优化比较

  • 关系数据库通过索引、缓存和查询优化等技术来提高查询性能。

  • 而 Elasticsearch 通过分片、索引和缓存等机制来加速搜索和数据聚合分析能力。

4、 误用 Elasticsearch 的潜在问题

将 Elasticsearch 当作关系数据库使用可能会导致以下问题:

4.1 问题1:性能不佳

复杂的事务和多表关联操作会显著降低 Elasticsearch 的性能,因为它不是为这些操作设计的。

如:我们希望在查询订单时关联多个表(例如订单、客户和产品表),但由于 Elasticsearch 并不是为这种复杂的多表关联操作设计的,导致查询性能极差。

不论 Nested 查询、Join 查询,都试图在订单文档中查找特定客户购买的特定产品,这类似于 SQL 中的 JOIN 操作。

由于 Elasticsearch 不是为这种操作设计的,在数据量级非常大之后,查询性能会受到影响,并且扩容等优化手段效果也不见得明显。

4.2 问题2:数据一致性

Elasticsearch 不提供事务支持,无法保证数据的一致性和完整性,特别是在多文档操作的情况下。

非银行金融类事务级支持场景可以大胆使用 Elasticsearch。话说回来,很多银行也在使用 ElasticStack 技术栈,比如日志场景、全文检索场景等。

4.3 问题3:索引膨胀

由于 Elasticsearch 的文档存储方式,频繁的更新操作可能导致索引膨胀,增加存储和管理的复杂性。

如下所示,我们频繁更新订单状态和产品库存,由于 Elasticsearch 的文档存储方式,这些更新导致索引膨胀,增加了存储和管理的复杂性。

POST /orders/_update/123
{
  "doc": {
    "status": "shipped"
  }
}

POST /products/_update/456
{
  "doc": {
    "stock": 99
  }
}

每次更新都会创建一个新的文档版本,导致索引膨胀。如果订单和库存更新非常频繁,索引会迅速增长,影响性能并增加存储成本。

这个咱们选型、建模的时候要考虑。

5、正确使用 Elasticsearch 的建议

为了充分发挥 Elasticsearch 的优势,避免上述问题,以下是一些建议:

在选择 Elasticsearch 之前,明确了解你的需求和应用场景。如果需要处理复杂的事务和关系数据,关系数据库可能更适合。

在一些企业级实战场景中,可以将 Elasticsearch 与关系数据库结合使用。关系数据库用于处理事务和关系数据,Elasticsearch 用于全文搜索和数据分析。结合产生“火花”,形成“1+1>2”的组合效果。

根据数据特点和查询需求,合理设计和优化 Elasticsearch 索引、合理规范的数据建模,避免不必要的字段和过多的嵌套结构。

合理配置分片和副本数量,确保集群性能和数据高可用性。使用 Elasticsearch 提供的监控工具,定期分析和优化集群性能,及时处理潜在问题。

6、小结

Elasticsearch 是一种强大的工具,提供了全文搜索和数据聚合分析功能,但不是关系数据库的替代品。它在处理复杂事务和关系数据时并非最佳选择。理解其设计和用途,避免将其当作关系数据库使用,可以避免性能和数据一致性问题。合理设计和优化能够充分发挥 Elasticsearch 的优势,实现高效的数据搜索和分析。

正确使用 Elasticsearch 需要理解其设计理念和应用场景。结合使用关系数据库和 Elasticsearch(记住:1+1>2),可以实现更高效的数据管理和分析。

希望本文能帮助读者更好地理解和使用 Elasticsearch,避免选型和使用误区,从而实现更好的应用效果。


2024星球专享:Elastic 8.1 认证全部知识点 脑图 + 视频

https://articles.zsxq.com/id_njwt7kus4r42.html 

新时代写作与互动:《一本书讲透 Elasticsearch》读者群的创新之路

af86548feaba72f6e25a1ae16818f145.png

更短时间更快习得更多干货!

和全球2000+ Elastic 爱好者一起精进!

elastic6.cn——ElasticStack进阶助手

90ddd69834985240b56842d9c78b8936.gif

比同事抢先一步学习进阶干货!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1859602.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何在Windows系统部署Terraria私服并配置公网地址实现远程联机

文章目录 前言1. 下载Terraria私服2. 本地运行Terraria 私服3. 本地Terraria私服连接4. Windwos安装Cpolar 工具5. 配置Terraria远程联机地址6. Terraria私服远程联机7. 固定远程联机地址8. 固定的联机地址测试 前言 本文将为你详细介绍在本地如何运行泰拉瑞亚本地私服和结合C…

Recovery

Steal:允许未提交的事务写到磁盘上 Force:在事务提交之前该事务所有更新必须被写到磁盘上 No-StealForce 性能差,需要等待修改被写到磁盘上才能顺利commit 不需要undo,因为aborted事务不会被写到磁盘上 不需要redo&#xff0…

Ubuntu Apache2 搭建Gerrit 环境

一、前言 时隔多年,好久没有更新CSDN 博客了,主要原因有如下两点: 1、平时工作繁忙,无暇更新。 2、工作内容涉及信息安全,一些工作经验积累不便更新到互联网上。 最近一直在折腾搭建Gerrit 环境,最开始…

红酒邂逅时尚,品味生活的双重魅力,引领潮流新风尚

在繁华的都市中,红酒与时尚如同一对孪生姐妹,共同诠释着品味生活的双重魅力。红酒,那深邃的色泽中蕴藏着千年的历史与文化;时尚,那流转的光影中凝聚着时代的潮流与个性。当两者相遇,便碰撞出了特别的火花&a…

BEVDistill

摘要 将激光雷达检测器纳入多视图 3D 物体检测,在 BEV 空间中统一图像和激光雷达特征,让图像BEV特征自适应学习点云BEV特征。 背景 LiDAR 点可捕获精确的 3D 空间信息,为基于相机的目标检测提供自然指导。鉴于此,最近的相关工作…

Handling `nil` Values in `NSDictionary` in Objective-C

Handling nil Values in NSDictionary in Objective-C When working with Objective-C, particularly when dealing with data returned from a server, it’s crucial (至关重要的) to handle nil values appropriately (适当地) to prevent unexpected crashes. Here, we ex…

ModbusRTU协议报文解析

ModbusRTU协议报文解析 报文格式: 设备地址/从站地址: 1个字节 指定目标设备地址(从站地址) 功能码:1个字节 功能码在modbus协议用于表示信息帧的功能,例如读取线圈状态、读取寄存器等。 数据&#xff…

SSRF漏洞原理与案例分析

一、什么是SSRF漏洞 SSRF (Server-Side Request Forgery:服务器端请求伪造)是一种由攻击者构造请求,由服务端发起请求的安全漏洞。一般情况下,SSRF攻击的目标是外网无法访问的内部系统(正因为请求是由服务端发起的,所以服务端能请…

论文速递 | Management Science 4月文章合集(下)

编者按 在本系列文章中,我们梳理了运筹学顶刊Management Science在2024年4月份发布有关OR/OM以及相关应用的13篇文章的基本信息,旨在帮助读者快速洞察领域新动态。本文为第二部分(2/2)。 推荐文章1 ● 题目:Social Le…

HarmonyOS应用开发——Hello World

下载 HUAWEI DevEco Studio: https://developer.harmonyos.com/cn/develop/deveco-studio/#download 同意,进入配置页面: 配置下载源以及本地存放路径,包括nodejs和ohpm: 配置鸿蒙SDK路径: 接受协议: 确认无误后&#…

面试-细聊synchronized

1.线程安全问题的主要诱因: 存在多条共享数据(临界资源) 存在多条线程共同操作这些共享数据 解决问题的根本方法: 同一时刻有且仅有一个线程在操作共享数据,其他线程必须等到该线程处理完数据后在对共享数据进行操作。 2.synchroized锁 分…

边缘计算为企业解决数据问题,提升业务效率和竞争力-天拓四方

企业在当前数字化时代面临着一系列具体的问题和挑战,这些问题往往与数据处理、实时响应、安全性以及运营成本等方面密切相关。边缘计算作为一种新兴的计算模型,能够有效地帮助企业解决这些问题,提升业务效率和竞争力。 首先,企业…

清华、北大与微软推出Glyph-ByT5-v2,精准生成文字海报,支持10种语言,效果炸裂

前言 在 AI 领域,文生图技术已经取得了令人惊叹的进展,但如何将文字精准地融入图像,并支持多种语言,一直是研究人员面临的挑战。为了解决这一难题,清华大学、北京大学和微软亚洲研究院的研究人员合作推出了 Glyph-ByT…

网络安全等级保护测评

网络安全等级保护 《GB17859 计算机信息系统安全保护等级划分准则》 规定计算机信息系统安全保护等级共分五级 《中华人民共和国网络安全法》 “国家实行网络安全等级保护制度。 等级测评 测评机构依据国家网络安全等级保护制度规定,按照有关 管理规范和…

泰迪智能科技与成都文理学院人工智能与大数据学院开展校企合作交流

近日,在推动高等教育与产业深度融合的背景下,成都文理学院人工智能与大数据学院携手广东泰迪智能科技股份有限公司开展“专业建设交流会”。人工智能与大数据学院院长胡念青、院长助理陈坚、骨干教师刘超超、孙沛、赵杰、文运、胡斌、邹杰出席本次交流会…

二级web基础操作题练习

---------要求--------- 利用HTML和CSS实现如图所示页面: ---------代码示例--------- 分析:该页面包含一个标题、一个副标题、“姓名信息”的表格,并且有一段文字提示用户仔细填写,使用内联CSS来控制HTML页面的视觉外观&…

TiDB 资源管控的对撞测试以及最佳实践架构

作者: GreenGuan 原文来源: https://tidb.net/blog/bc405c21 引言 TiDB 是一个存算分离的架构,资源管控对这种分离的架构来说实现确实有非常大的难度,TiDB 从 7.1 版本开始引入资源管控的概念,在社区也有不少伙伴测…

SpringUtils.getBean 空指针异常问题

因为这个项目license问题无法开源,更多技术支持与服务请加入我的知识星球。 今天在新的jeecg-boot里加入下面的代码 /*** 部门经理处理类** author nbacheng* date 2023-08-06*/ AllArgsConstructor Component("DepManagerHandler") DependsOn({"Sp…

el-form重置后input无法输入问题

新增用户遇到的问题: 如果你没有为 formData 设置默认值,而只是将其初始化为空对象 {},则在打开dialog时,正常输入, formdata会变成如下 但是,打开后,直接使用 resetFields 或直接清空表单&…

封装vuetify3中v-time-picker组件,并解决使用时分秒类型只能在修改秒之后v-model才会同步更新的问题

目前时间组件还属于实验室组件&#xff0c;要使用需要单独引入&#xff0c;具体使用方式查看官网 创建公共时间选择器组件 common-time-pickers.vue 子组件页面 <template><div><v-dialog v-model"props.timeItem.isShow" activator"parent&q…