为什么不要使用elasticsearch

news2024/11/26 22:22:44

互联网上有很多文章,都在讲为什么要使用elasticsearch,却很少有人讲为什么不要使用elasticsearch。作为深入研究elasticsearch四年,负责公司万亿级别检索的操盘手,借着这篇文章,给大家分享一下,为什么不要使用elasticsearch。

028f24fec5ff4e10a773a905f30cc444.png

一、不要使用的理由

1. 学习成本

elasticsearch的文档蛮多的,而且看一遍什么用都没有,而且看一遍的时间成本很长。但是多看几遍,绝对有用。“书读百遍其义自见”。

一个参数都要看好久,研究好久。关键还不一定能看出来,这参数有啥用。看明白了,还不一定对(有时候没看懂是好事,不会翻车)。这些要结合生产实践才有机会接触到,才有用。

做好es搜索,这条路,我已经走了四年, 这已经是第五个年头了。前年定的flag,看完全部的源码,到现在还没有实现。仅仅看了冰山一∠。这四年看完了网上所有包含es优化的帖子。看了市面上有的全部的es的书籍。看了N遍官方文档。现在API都没记全,仅能做到,知道需要的时候去哪里找!

等我把es都看明白的时候,又发现,这些不够,底层数据结构,还有lucene这些。 es只是一个分布式壳子。于是一年又过去了,回头看,之前的那些似乎都忘了,仅有一点印象。等看完了lucene的底层原理,惊叹,wo c! 前辈为何如此聪明。绝了!只是又发现这才刚入门,顶多算精通es,才明白我是做es的,不是做搜索的。这就像,当你到达了一个山顶,才看到了更高的山峰。这个阶段,可以做到很好的使用es,可以去优化性能,可以得心应手的完成功能需求。但是想要在搜索这条路上走下去,还有更多的事情要做。query改写,意图识别,粗排,精排,这些优化召回质量的东西,像无底洞一样。

GTP火热后,RAG又是一个好的方向。

此外,es官方版本更新的很快。可能我们学习的速度赶不上更新的速度(当然有点夸张)

 

2. 需要场景

如果问:“你为什么不学,不想学这些?”

回答:“学了没用” ,这是真的,推动一个人进步的是需求。就像水涨船高一样,船的高度,是由水决定的。当然我们有选择海域的机会,但是不多。

我自己的经验来看,一开始做18亿数据的集群,我当时已经提升了数十倍了。我觉得自己很了不起。但是在现在看来(万亿量级搜索优化),真想承认当时的井底之蛙。还记得之后拿着这18亿数据优化经验,去面试同程,被虐的体无完肤,感受到当时面试官不想面下去的尴尬。当时我还想向他请教怎么优化,面试官并没有回答我,只说了一句好好看看文档。当时还有点不理解,确实浪费时间。当我今天面试别人的时候,我体会到了这一点。不过,我分享了自己的经验。所以任何时候不要妄自菲薄,别人能达到的高度,我们也能达到,只是时间问题。

也是机会巧合,接触到现在这家万亿级数据级的检索优化工作。但是这种需求量总是小的,能有多少家公司数据量有万亿? 同样,我做了两年了,query改写,意图识别这些召回相关的优化,我也没有做过。

是环境决定了我们的高度!是需求成就了我们,这是真的!

 

3. 集群成本

尽管Elasticsearch是一种功能强大、灵活且广泛使用的搜索和分析引擎,但它也存在一些潜在的挑战和限制。

都说es很快,检索首选es。但是作为过来人,Elasticsearch需要大量的内存、存储和计算资源来有效地运行。如果你的应用程序规模较小或资源受限,可能不适合使用Elasticsearch。

es是天然的分布式,很轻松hold住海量数据检索。但是代价是极其昂贵的,很多人优化搜索,第一想到的是堆机器,能用钱解决的问题都不是问题。一台服务器的成本至少在10W,一台服务器能高性的运行(保证写入和检索的性能),大概嫩挂载的数据在10T。这里可以算一下,假如数据是PB,想要扩一倍集群,成本是多少? 大概一千万。从堆机器来解决优化的这条路,绝对不是通向罗马的那一条。

es能够保证检索速度,是很吃资源的!比如SSD磁盘是必备的,如果你很关注检索性能的话。我敢保证,钱花在SSD上绝对是值的。花一倍的钱去扩一倍机器,不如从HDD换成SSD。

那好下边再来聊聊从技术角度的优化成本。

 

4.技术复杂性

 其实在第一点,学习成本上已经聊过了 Elasticsearch是一个复杂的工具,需要深入理解其配置、管理和优化。团队没有足够的经验或资源来管理它,可能会导致性能下降或系统不稳定。一个小小的参数就能降低N倍性能,好不夸张。同样一个小小的参数也能提升N倍。

文档上有蛮多参数,可以考虑优化的,但是都需要时间去弄明白它。但是能不能用,在特大规模集群上使用,敢吗?

并且我觉得很多优化是藏才源码中的。像开好车,还真得打开引擎盖看一看。

此刻,折腾的第五年,我可能还停留在不知道我不知道的阶段。选择做es搜索,这就是一条不归路。大把的时间,大把的头发都要花掉。

 

5.维护难度

Elasticsearch需要定期维护和更新以确保安全性和性能。如果团队缺乏必要的专业知识或时间来进行维护,可能会面临安全漏洞或性能问题。 即使有着丰富经验的人,也会经常翻车。

其实在大体量数据下,很多问题都会放大。假如数据有100G,重做升级一下,也就是两天的时间。但是PB级别的数据,怎么调整呢,怎么业务无感知呢?通常很多问题 ,确实可以通过升级版本来解决。但是船大不好掉头,这也是真的。

人工成本蛮高的!es想要运行的快,需要对es领域有深入研究的专精人员。才可以。

这里给大家分享几个case:

在6.X之前的版本中,在大体量数据下,会有堆空间不足的问题。这在7.X版本可以得到很好的缓解。因为官方做了源码的改动,把FST从堆内挪到了堆外。

在7.X版本中,仍然会遇到堆空间不足的问题。字节的同学了一个lucene的bug。因为threadlocal的原因,无法释放堆空间。随着索引变多,检索次数变多,堆可用空间越来越少。这会让检索莫名其妙的变慢。多少人还处于水生火热之中,天天慢查询报警,不知所措。这一问题在8.X得到了解决。

还有一个问题,在低版本中( 7.16 之前 )。无法通过后天命令关闭聚合分析任务。这对熔断非常不友好。很多次节点打挂,都是聚合分析请求导致的。

总之运维很头疼,想做好更头疼。想好了嘛?还要用es嘛?

 

6. 鱼和熊掌不可兼得

像mysql,数据量大于300w就会变慢了。 es确实有非常好的查询能力,非常好的写入能力。但这都是有代价的,由底层数据结构决定。例如这些没有的能力:

 

mapping不可改,不能改index属性

根本原因是因为它是日志合并树的概念,无法对已经写入的数据做修改(改字段)。官方文档中介绍了几种修改mapping的方法。一个是新建一个字段,程序中所有地方修改名字,这对于复杂的项目容易出错,而且无法保留原来的数据;另一个是利用aliaa创建一个新的索引,但是所有数据需要重新导入,这需要很长时间,操作性不强。

 

无法多对多

Elasticsearch中提供3中关联关系,Field collapsing(严格来说不是关联),Nested object,Parent-child。前两种都是直接将一个mapping声明在另一个mapping中,第三种关联是在创建子文档是指明他的父文档,但是一个子文档只能有一个父文档,因此也不能实现多对多的关联。其实如果理解了ES的目的是提升检索效率,就不难理解为什么没有多对多关联了,在关系数据库里这就是个效率瓶颈。

es无法做多表查询,父子关联查询,性能是极低的。只能考虑大宽表解决。

 

es没有事务

对事务有要求的,则需要自己实现。

 

二、真的不要使用es吗?

当然,我依然觉得es好用,它很优秀。如果你能接受以上提出的几个点,不妨开始学习es,深入研究es。

这里是我做过的搜索优化的分享专栏,千万不要点进来,提升几十倍怎么办!

https://blog.csdn.net/star1210644725/category_12341074.html?spm=1001.2014.3001.5482

 

这是我这几年研究的es的专栏

https://blog.csdn.net/star1210644725/category_9654555.html

 

 

 

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

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

相关文章

jetson nano在python中illegal instruction

在使用nano原生的python中导入numpy报错 安装anaconda也装不上 安装miniforge可以安装上 参考 【nano系列】jetson nano 安装conda管理环境(三)_jetson 安装conda-CSDN博客 下载地址 Releases conda-forge/miniforge GitHub 下载完毕后执行 bash Mam…

Room+ViewModel+LiveData

Room框架支持的LiveData会自动监听数据库的变化,当数据库发生变化的时候,会调用onChanged函数更新UI 1.MainActivity package com.tiger.room2;import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.vie…

Vue3全家桶 - Pinia - 【1】(安装与使用 + Store + State + Getters + Actions)

Pinia pinia 是 Vue 的专属状态管理库,它允许你跨组件或跨页面共享状态; 一、 安装与使用 pinia 安装语法:yarn add pinia npm install pinia创建一个 pinia (根存储)并将其传递给应用程序: 目标文件&am…

[C语言] 数据存储

类型意义: 1.类型决定内存空间大小(大小决定了使用范围) 2.如何看待内存空间的视角 类型分类 整形 类型大小(字节)short2int4long4long8 浮点型 类型大小(字节)float4double8long double12 构造类型 数组结构性struct联合union枚举enum 指…

七个项目掌握freertos

1、闪烁LED: 最基本的示例项目,涉及到创建一个简单的任务,用于控制LED的闪烁。这个项目会教你如何初始化FreeRTOS并创建任务。 #include "FreeRTOS.h" #include "task.h" #define LED_PIN (某个GPIO引脚)void vBlinkTas…

BUGKU-WEB cookies

题目描述 题目截图如下: 进入场景看看: 解题思路 看源码看F12:看请求链接看提示:cookies欺骗 相关工具 插件:ModHeader或者hackbarbase64解密 解题步骤 看源码 就是rfrgrggggggoaihegfdiofi48ty598whrefeoia…

2000-2023年7月全国各省专利侵权结案案件数量数据

2000-2023年7月全国各省专利侵权结案案件数量数据 1、时间:2000-2023年7月 2、指标:地区、年份、专利侵权纠纷行政案件-结案数目 3、范围:31省 4、来源:国家知识产权局,并由该局每个月公布的数据汇总而成 5、指标…

STM32CubeIDE基础学习-STM32CubeIDE软件代码编写格式问题

STM32CubeIDE基础学习-STM32CubeIDE软件代码编写格式问题 前言 代码编写最好就是规定一个格式,或者建立一个偏好,这样写出来的代码就方便自己管理了,不然代码乱放下次打开工程就很难找到具体位置,如果规定了格式,那么…

LeetCode中的returnSize和returnColumnSize

今天这篇比较水,不过本文要讲的内容是我曾经遇到过的问题,也可能是大部分人在初次接触力扣时的一些疑问。当时遇到这个问题也是上网找了许久没有找到满意的答案,现在自己明白了,也希望能够帮助还抱有疑惑的各位解答。 如果我说的…

认证授权与JWT

认证授权与JWT 1、认证授权概念介绍1.1 什么是认证1.2 什么是授权 2、权限数据模型3、RBAC权限模型3.1 介绍3.2 基于角色访问控制3.3 基于资源访问控制 4、常见认证方式4.1 Cookie-Session4.2 jwt令牌无状态认证 5 常见技术实现6.Jwt介绍6.1 JWT简介6.2.Jwt组成 7、JWT使用7.1 …

2024-3-12尾盘一致转分歧

安彩高科开一字符合预期,昨天风光储锂电大涨,理应给大溢价,超预期是 艾艾精工 高开秒板,立航科技高开分歧反核承接良好回封一致,带动了低空经济板块高潮,低空经济开始往 碳纤维 方向扩散。盘中我说了 三晖…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的火焰检测系统(Python+PySide6界面+训练代码)

摘要:本研究详述了一种采用深度学习技术的火焰检测系统,该系统集成了最新的YOLOv8算法,并与YOLOv7、YOLOv6、YOLOv5等早期算法进行了性能评估对比。该系统能够在各种媒介——包括图像、视频文件、实时视频流及批量文件中——准确地识别火焰目…

蓝桥杯真题讲解:子矩阵(二维滑动窗口)

蓝桥杯真题讲解&#xff1a;子矩阵&#xff08;二维滑动窗口&#xff09; 一、视频讲解二、正解代码 一、视频讲解 蓝桥杯真题讲解&#xff1a;子矩阵&#xff08;二维滑动窗口&#xff09; 二、正解代码 //二维单调队列 #include<bits/stdc.h> #define endl \n #def…

Midjourney绘图欣赏系列(十一)

Midjourney介绍 Midjourney 是生成式人工智能的一个很好的例子&#xff0c;它根据文本提示创建图像。它与 Dall-E 和 Stable Diffusion 一起成为最流行的 AI 艺术创作工具之一。与竞争对手不同&#xff0c;Midjourney 是自筹资金且闭源的&#xff0c;因此确切了解其幕后内容尚不…

(二)运行自己的stable-diffusion

前面的步骤如https://datawhaler.feishu.cn/docx/BwjzdQPJRonFh8xeiSOcRUI3n8b所示 拷贝、解压文件后&#xff0c;进入到stable-diffusion-webui的文件夹中&#xff0c;文件如下&#xff1a; 启动&#xff1a; 运行效果&#xff1a; 由于生成了好几个图&#xff0c;所以…

布隆过滤器(做筛选器索引)

什么是布隆过滤器 布隆过滤器&#xff08;Bloom Filter&#xff09;是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。 它的优点是空间效率和查询时间都比一般的算法要好的多&#xff0c;缺点是…

学习vue3第四节(ref以及ref相关api)

主要记录以下api&#xff1a;ref()、isRef()、unref()、 shallowRef()、triggerRef()、customRef() 1、ref() 定义 接受一个内部值&#xff0c;返回一个响应式的、可更改的 ref 对象&#xff0c;此对象只有一个指向其内部值的属性 .value&#xff0c;.value属性用于追踪并且存…

I2C驱动AT24C02

文章目录 一、硬件电路设备地址 二、使用步骤字节写:页写入:任意写:任意读: 一、硬件电路 设备地址 设备需要一个8位的设备地址字&#xff0c;后面跟着一个启动条件&#xff0c;以使芯片能够进行读或写操作 设备地址字由一个强制的1,0序列的前四个最有效的位&#xff0c;如所示…

简单使用国产数据库—达梦

达梦数据库是一款由中国的达梦软件公司开发的关系数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它在业界以其高性能、可扩展性和安全性而著称。该系统广泛应用于各种应用程序的数据存储和管理&#xff0c;满足用户对于数据处理和管理的多样化需求。 安装好的达梦数…

容联云孙昌勋:聚焦“营销服”数智化转型,构筑金融业增长引擎

在每日经济新闻2024全国两会特别报道中&#xff0c;容联云创始人兼CEO孙昌勋针对“人工智能”在具体行业如何开展时表示&#xff1a;“随着泛金融行业用户渠道与体验发生变化&#xff0c;金融业对营销、销售、服务等场景的数智化改造有巨大的需求&#xff0c;人工智能等科技投入…