为什么不要使用elasticsearch

互联网上有很多文章,都在讲为什么要使用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.mzph.cn/news/739867.shtml

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

相关文章

Vue3全家桶 - VueRouter - 【2】重定向路由

重定向路由 在路由规则数组中,可采用 redirect 来重定向到另一个地址: 通常是将 / 重定向到 某个页面; 示例展示: router/index.js:import { createRouter, createWebHashHistory, createWebHistory } from vue-route…

混合测试写一写

题目 服务器IP地址规划:client:12.0.0.12/24,网关服务器:ens36:12.0.0.1/24、ens33:192.168.44.1/24,Web1:192.168.44.30/24,Web2:192.168.44.50/24,Nginx&am…

iOS应用内的沙盒目录

iOS系统的沙盒机制规定每个应用都只能访问当前沙盒目录下面的文件,在开发中常常需要数据存储的功能,比如存取文件,归档解档等,因此有必要熟悉沙盒目录及其作用。 Documents目录 开发者可以将应用程序的数据文件保存在这个目录下.…

bzm - Concurrency Thread Group 阶梯式压测

bzm - Concurrency Thread Group 不是JMeter的官方插件,而是一种由Blazemeter提供的高级线程组插件,它提供了更灵活的并发性能测试设置。它可以在不同的时间内并发执行不同数量的线程,模拟不同的负载场景 插件下载地址:Download …

加速 Webpack 构建:提升效率的秘诀

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

网络通信另个角度的认识(进程间通信),端口号(为什么要有,和pid的关系,分类,如何封装,和进程的定位原理+对应关系),客户端如何拿到服务端的port

目录 另一个角度认识网络通信 端口号 引入 -- 为什么要有端口号 问题 解决 端口号和pid 举例 介绍 分类 知名端口 注册端口 动态端口 客户端如何知道服务端的端口号 封装端口号 定位原理 进程和端口号的对应关系 数据如何被上层进程读到 另一个角度认识网络…

【Java EE初阶十一】多线程进阶二(CAS等)

1. 关于CAS CAS: 全称Compare and swap,字面意思:”比较并交换“,且比较交换的是寄存器和内存; 一个 CAS 涉及到以下操作: 下面通过语法来进一步进项说明: 下面有一个内存M,和两个寄存器A,B; CAS(M,A,B)&am…

吴恩达机器学习-可选实验:梯度下降逻辑回归(Gradient Descent for Logistic Regression)

文章目录 目标数据集Logistic梯度下降梯度下降实现计算梯度,代码描述 另一个数据集 目标 在本实验中,你将: 更新逻辑回归的梯度下降在一个熟悉的数据集上探索梯度下降使用梯度下降给逻辑回归更新参数 import copy, math import numpy as np %matplotl…

怎么判断你的模型是好是坏?模型性能评估指标大全!

模型性能评估指标,大家一定不陌生!很多小伙伴们都说难,但是它真的很重要很重要很重要!它会对我们的模型有很多的指导,也会给我们真正做模型的时候提供一些指导性的思想,不然我们看到别人的东西只能跟着人家…

【linux】冯诺依曼体系与操作系统的理解

本篇文章是进程的预备知识,但也不仅仅是进程的预备知识, 也可以更好地帮助我们理解整个计算机体系。 目录 冯诺依曼体系结构:进一步理解操作系统: 冯诺依曼体系结构: 关于这张图先进行一下必要的解释: 输…

怎样通过IT服务台来增强IT项目管理?

当下,越来越多的企业和组织重视IT项目管理的重要性。而如何通过IT服务台来增强和提升IT项目管理效率,成为了许多企业领导和IT专业人员共同关注的话题。如何充分利用IT服务台,以促进IT项目管理水平的提升和项目成功率的增加变得至关重要。 1…

怎么免费下载无水印视频素材?赶快收藏这六个网站。

今天来教大家怎么下载无水印视频素材,其中一些是免费的,并且可以在商业项目中使用,这些网站都是无水印视频素材,可以放心使用。 蛙学网: 网站的内容非常丰富多彩,包括风景,夜景,食物…

论文阅读:Editing Large Language Models: Problems, Methods, and Opportunities

Editing Large Language Models: Problems, Methods, and Opportunities 论文链接 代码链接 摘要 由于大语言模型(LLM)中可能存在一些过时的、不适当的和错误的信息,所以有必要纠正模型中的相关信息。如何高效地修改模型中的相关信息而不影…

java学习(Arrays类和System类)

目录 目录 一.Arrays类 二.System常见方法 三、Biglnteger和BigDecimal(高精度) 1.Biglnter的常用方法 2.BigDecimal常见方法 3.日期类 1)第一代日期类 2)第二代日期类 3)第三代日期类 一.Arrays类 Arrays包含了一系 列静态方法&am…

11、Linux-安装和配置Redis

目录 第一步,传输文件和解压 第二步,安装gcc编译器 第三步,编译Redis 第四步,安装Redis服务 第五步,配置Redis ①开启后台启动 ②关闭保护模式(关闭之后才可以远程连接Redis) ③设置远程…

12双体系Java学习之局部变量和作用域

局部变量 局部变量的作用域 参数变量

在 Python 中从键盘读取用户输入

文章目录 如何在 Python 中从键盘读取用户输入input 函数使用input读取键盘输入使用input读取特定类型的数据处理错误从用户输入中读取多个值 getpass 模块使用 PyInputPlus 自动执行用户输入评估总结 如何在 Python 中从键盘读取用户输入 原文《How to Read User Input From t…

AI写真变现项目丨超级训练营SOP手册

出品方: 吴东子团队 x AI破局俱乐部 以下只是该SOP手册的部分介绍,AI写真变现项目上手到变现全流程,需要完整手册的可以dd我。 AI写真 首先什么是AI写真,顾名思义的话可以说成是用AI生成写真照,我们先暂且这么理解&am…

Java详解:单列 | 双列集合 | Collections类

○ 前言: 在开发实践中,我们需要一些能够动态增长长度的容器来保存我们的数据,java中为了解决数据存储单一的情况,java中就提供了不同结构的集合类,可以让我们根据不同的场景进行数据存储的选择,如Java中提…