## Elasticsearch
Elasticsearch是一个流行的搜索引擎,基于Apache Lucene项目(也是Apache Solr的父项目),自2010年以来已被许多人用于搜索和日志分析。它的设计具有高度可扩展性,可用于广泛的应用程序,从简单的搜索功能到复杂的数据分析。
Elasticsearch和Kibana作为Elastic Stack的一部分,都有一套强大的功能,包括支持全文搜索、企业搜索、真实的时间分析和地理空间查询。它曾经在Apache许可证下完全开源,直到2021年初竞争对手亚马逊开始创建自己的项目。Elasticsearch通常部署在自我管理或Elastic Cloud上。
## 什么是OpenSearch?
OpenSearch搜索引擎是亚马逊自2021年1月以来维护的Elasticsearch的一个分支。在fork事件之前,它基本上是相同的代码库,这也是项目开始略有分歧的时候。OpenSearch的一个关键特征是它对透明度和社区驱动开发的关注。
与Elasticsearch不同,OpenSearch由社区驱动的基金会管理。这意味着任何人都可以为OpenSearch的发展做出贡献。虽然这两个软件产品的代码库都是开放的,任何想要审查它的人都可以检查,但贡献代码和影响OpenSearch的方向比Elasticsearch更容易。它通常用作Amazon OpenSearch Service(以前称为Amazon Elasticsearch Service)的一部分。
在比较这两者时,我们将回顾Codebase作为牵引力和开发工作的信号,以及特性-因此您可以选择哪一个更适合您的需求。
## 代码库和发布
OpenSearch项目在7.10.2版本是最新版本时派生了Elasticsearch代码库,然后在OpenSearch代码库上进行了大量工作,以重命名项目并清理所有非Apache许可的代码(即X-Pack功能)。为了正确地比较两者所做的工作,我们统计了自2021年4月22日以来在主/主分支上进行的提交,这标志着OpenSearch在几个月前分叉后的第一个候选版本。
Elasticsearch仓库有近20 k次提交,其中6 k次提交到核心Elasticsearch(“服务器”文件夹),还有一些提交到卫星模块:
```
# total commits in repo since fork
➜ elasticsearch git:(master) git log --oneline --all --since='Apr 22 2021' | wc -l
19527
# total commits to the main codebase (server folder) since fork
➜ elasticsearch git:(master) git log --oneline --all --since='Apr 22 2021' -- server/ | wc -l
6130
# total commits to main modules (various surrounding functionality not under x-pack) since fork
# https://github.com/elastic/elasticsearch/tree/main/modules
➜ elasticsearch git:(master) git log --oneline --all --since='Apr 22 2021' -- modules/ | wc -l
1437
# just as means of comparison, the amount of work made on x-pack features is not negligible
➜ elasticsearch git:(master) git log --oneline --all --since='Apr 22 2021' -- x-pack/ | wc -l
7294
```
OpenSearch的核心代码提交减少了超过3倍,重要模块的工作量减少了14倍,其中包括脚本语言、重新索引功能、摄入管道处理器等:
```
➜ OpenSearch git:(main) git log --oneline --all --since='Apr 22 2021' | wc -l
3727
➜ OpenSearch git:(main) git log --oneline --all --since='Apr 22 2021' -- server/ | wc -l
1966
# total commits to main modules (surrounding functionality not under x-pack) since fork
# https://github.com/opensearch-project/OpenSearch/tree/main/modules
➜ OpenSearch git:(main) git log --oneline --all --since='Apr 22 2021' -- modules/ | wc -l
470
```
因此,与Elasticsearch发布的版本(主要和次要)相比,OpenSearch发布的版本较少。
虽然提交的数量并不是代码质量或软件性能的直接证据,但很明显,Elasticsearch项目在核心上看到了更多的工作,这反过来肯定会转化为**更好的性能,更多的功能,跟上最新版本的依赖项和Lucene功能**等等-特别是当差异达到这种程度时。
## 功能比较
搜索、分析和仪表板的所有基本功能在这两种技术之间完全相同。毕竟,OpenSearch是从Elasticsearch的一个非常成熟的版本派生出来的。对于标准用例,从功能的角度来看,选择哪个搜索引擎并不重要。
项目之间的功能差异将是Elastic的X-Pack(免费或付费)下的任何内容,以及分叉后添加的所有功能。
对于重要的功能,去一点点以上只是基本的-那些最终存在或将存在于两者。作为主要的例子,我们可以列出以下内容:
* [数据流API](https://www.elastic.co/guide/en/elasticsearch/reference/current/data-stream-apis.html)由两者实现(尽管Elasticsearch刚刚发布了OpenSearch中没有的[时间序列数据流](https://www.elastic.co/guide/en/elasticsearch//reference/master/tsds.html))
* 索引状态管理在OpenSearch中成为索引状态管理
* 两者都有一些警报支持(尽管我们实际上建议使用[ElastAlert2](https://elastalert2.readthedocs.io/en/latest/),而不是任何[内置的警报解决方案](https://bigdataboutique.com/blog/alerting-with-elasticsearch-and-the-elastic-stack-video-jpaoum))。
* 两者都支持跨集群复制,在Elasticsearch中,这是一个高级层功能(不是免费的)。
在写这篇文章的时候,一些利基核心功能仍然是Elasticsearch独有的,比如geoshape和geohex网格聚合。
一些OpenSearch功能仅在托管服务Amazon OpenSearch Service上可用,另一方面,与Elastic Cloud不同,Elastic Cloud始终保持最新的Elasticsearch版本,**Amazon的托管OpenSearch产品通常落后2-3个版本**。
大多数主要差异存在于可用于各种用例的垂直解决方案堆栈(例如APM,SIEM等)。以下是Elasticsearch和OpenSearch之间的主要区别。
## 安全
Elasticsearch和OpenSearch中的安全功能是一个相当广泛的类别,涉及几个功能和问题。身份验证(允许用户进入)、授权和RBAC(基于角色的访问控制)、用户模拟、审计日志、静态和传输中的加密以及各种多租户问题。
Elasticsearch的所有内置安全功能都是X-Pack Basic许可证的一部分,并且仅限于基于Elasticsearch的用户目录。从7.0版开始,所有用户都可以免费使用。要使用LDAP、OpenID、SAML和更多**付费许可进行身份验证,需要**使用这些许可。这同样适用于其他安全功能,如IP过滤,文档和字段级安全等。
OpenSearch提供相同的安全功能和控制,但**完全免费**。[OpenSearch的安全模块](https://github.com/opensearch-project/security#readme)完全在开放环境下开发,具有所有必要的功能:[Active Directory和LDAP](https://opensearch.org/docs/latest/security-plugin/configuration/ldap/)、SAML、OpenID、访问控制功能(包括屏蔽和字段级安全性)、审计日志、加密支持等。
随着安全性的发展,Elasticsearch和OpenSearch完全处于同一水平,OpenSearch通过将所有这些完全免费作为开源内置模块提供而具有优势。
## 可搜索快照
创建“离线”搜索体验的能力,从而显著减少了使用较旧、访问频率较低的数据运行Elasticsearch集群所需的硬件数量,这对许多用例来说是一个真正的游戏规则改变者。
Elasticsearch已经实现了这个功能,并且已经广泛使用了一段时间;而OpenSearch最近刚刚发布了它,它仍然被标记为实验性的。然而,非常重要的是- Elasticsearch需要在高层(企业)上使用此功能的**付费许可证**,而在[OpenSearch中,可搜索快照](https://opensearch.org/docs/latest/tuning-your-cluster/availability-and-recovery/snapshots/searchable_snapshot)是**一个完全免费的功能**。
此功能由托管服务提供,在Elastic Cloud中称为“可搜索快照”或“冻结层搜索”,在Amazon OpenSearch Service中称为“Ultrawarm”。
## 机器学习
我们的建议是,不要仅仅因为Elasticsearch或OpenSearch不是专门为它构建的,就在其上运行机器学习和人工智能工作负载。当然,有时候它很方便,但它不是没有价格标签的。
Elasticsearch和OpenSearch应该被认为是服务层引擎。你应该准备好数据结构,这样无论是否涉及ML,都可以轻松地从它们中提供数据。例如,您可以使用向量字段(密集或稀疏向量)并使用kNN / ANN算法通过向量搜索查找类似文档。
另一种方法是使用重新评分方法,如LTR插件所做的,以提高评分能力。
Elasticsearch和OpenSearch都为机器学习工作负载和用例提供了内置的解决方案(或“应用程序”),在某些情况下可能会派上用场(例如Elastic Stack中的内置SIEM),但在我们看来-不是一般的,广泛的使用。
## 数据摄取
当分叉发生时,Elasticsearch已经在作为Elastic Stack的一部分发布的所有外围软件工具中强制执行了版本检查。Logstash、Beats和JavaScript、Java等客户端库都在检查Elasticsearch集群,以确认它确实是Elasticsearch而不是OpenSearch。这在项目的这些方面产生了显著的分歧-**您不能在OpenSearch中使用现代的Logstash或Beats**;因此,您需要找到替代方案。
[Data Prepper](https://github.com/opensearch-project/data-prepper)技术是OpenSearch项目的一部分,旨在满足这一需求。
或者,有专门的连接器准备各种数据流技术,如Kafka连接Kafka,Flink接收器用于各种来源,等等。
## 客户端库
两者之间的一个显著差异是易于使用各种编码语言和平台,以及客户端库的成熟度。
Elasticsearch拥有几乎所有软件开发平台的客户端库- Ruby,JavaScript,.NET,Java,Python等等。虽然它是一个HTTP REST API,但有很多不同的API,有很多细节,一个好的客户端库能够提供良好的语法糖,并简化编写和维护与之交互的代码的过程。
自从分叉以来,大多数客户端库在尝试将它们连接到OpenSearch集群时都会抛出错误;随着时间的推移,这些技术自然会出现分歧,因此即使是核心和当前共享的API也会在两者之间发展和变化。因此OpenSearch需要开发和维护自己的客户端库。
不幸的是,**这是OpenSearch的一个大弱点**。我们尝试使用的各种客户端库都是最小的,缺乏,甚至有bug和文档漏洞。它们并不是完全不可用,但它们通常接近于不可用。有时直接使用简单的HTTP客户端库比使用OpenSearch的客户端库更容易。
## 许可和限制
当然,我们不能在没有讨论房间里的大象的情况下比较两者,这就是许可模式。Elasticsearch以前是在Apache许可证下发布的,这是一个非常宽松的许可证。这也是OpenSearch当前的许可证-但Elasticsearch现在是在一个不同的,不太宽松的许可证下发布的,许多人认为这不是开源许可证。
我和团队都不是律师--我们更喜欢保持高度的技术性,这是我们能够提供的真实的价值。但更多的时候,我们会被问到做X是合法的还是违反了Elastic的许可证。
要点是新许可证禁止将Elasticsearch API作为托管服务提供。如果你只是使用Elasticsearch作为你的应用程序的后端-你很好去。但是有很多灰色地带,比如将Elasticsearch嵌入作为一个整体销售的更大解决方案的一部分,暴露一些可以被视为Elasticsearch API的API(例如通过API进行搜索)等等。我们很多客户都希望**零风险**,特别是如果他们不需要Elasticsearch的任何特殊功能-他们选择使用OpenSearch并使用其基本功能,然后一些。
## 支持和文档
OpenSearch是一个开源项目,这意味着**没有官方支持**。OpenSearch的托管服务,如[Amazon OpenSearch Service](https://bigdataboutique.com/partners/amazon-opensearch-service)、Aiven等,将负责为您运行硬件和软件,但不负责您如何使用它。
Elasticsearch背后的公司Elastic Co确实通过其标准订阅许可证或通过Elastic Cloud上的托管产品提供支持。但同样,这种支持将是**有限的,并不总是提供最好的定制建议,如何使用该技术,以最好地满足您的需求**。
当文档不够时,当您需要一个真正的专家作为您值得信赖的顾问时,我们已经确立了我们作为Elasticsearch和OpenSearch支持的世界领导者的名字。除了咨询和迁移服务,我们还提供24/7生产支持,以帮助处理紧急事务,并始终保持集群的健康运行。
还可以查看[Pulse](https://bigdataboutique.com/solutions/pulse)\-我们的自动化顾问解决方案,用于主动监控和支持。
## 结论
简单地总结一下OpenSearch和Elasticsearch的比较--只要你不直接向客户提供Elasticsearch,或者不属于这样做的法律的灰色区域,你就可以安全地使用Elasticsearch和OpenSearch。
对于所有基本和主流的用例,Elasticsearch和OpenSearch之间没有任何区别。这些用例包括文本搜索、日志分析、仪表板等,这两种技术的用途完全相同。
由于广泛的客户端库支持,Elasticsearch很可能**更容易从任何地方集成**,并且由于**非常活跃的开发团队,Elasticsearch**也将更快地赶上bug和问题。
另一方面,OpenSearch很可能操作起来**更便宜**,如果你正在寻找一些超越基本功能的东西,比如一个成熟的SIEM,那么肯定是这样。这些解决方案的Elastic Stack实现很可能会更加成熟,但它们也会付出巨大的代价。
对于自我管理-这些可能是你的决定因素。如果你正在寻找一个托管的解决方案,**有更多的选择有OpenSearch**,显而易见的原因。
- 设计模式系列
- 工厂方法模式
- 序言
- Windows程序注册为服务的工具WinSW
- 基础
- 安装
- 开发规范
- 目录结构
- 配置
- 快速入门
- 架构
- 请求流程
- 架构总览
- URL访问
- 容器和依赖注入
- 中间件
- 事件
- 代码层结构
- 四个层次
- 路由
- 控制器
- 请求
- 响应
- 数据库
- MySQL实时同步数据到ES解决方案
- 阿里云DTS数据MySQL同步至Elasticsearch实战
- PHP中的MySQL连接池
- PHP异步非阻塞MySQL客户端连接池
- 模型
- 视图
- 注解
- @SpringBootApplication(exclude={DataSourceAutoConfiguration.calss})
- @EnableFeignClients(basePackages = "com.wotu.feign")
- @EnableAspectJAutoProxy
- @EnableDiscoveryClient
- 错误和日志
- 异常处理
- 日志处理
- 调试
- 验证
- 验证器
- 验证规则
- 扩展库
- 附录
- Spring框架知识体系详解
- Maven
- Maven和Composer
- 构建Maven项目
- 实操课程
- 01.初识SpringBoot
- 第1章 Java Web发展史与学习Java的方法
- 第2章 环境与常见问题踩坑
- 第3章 springboot的路由与控制器
- 02.Java编程思想深度理论知识
- 第1章 Java编程思想总体
- 第2章 英雄联盟的小案例理解Java中最为抽象的概念
- 第3章 彻底理解IOC、DI与DIP
- 03.Spring与SpringBoot理论篇
- 第1章 Spring与SpringBoot导学
- 第2章 Spring IOC的核心机制:实例化与注入
- 第3章 SpringBoot基本配置原理
- 04.SprinBoot的条件注解与配置
- 第1章 conditonal 条件注解
- 第2章 SpringBoot自动装配解析
- 05.Java异常深度剖析
- 第1章 Java异常分类剖析与自定义异常
- 第2章 自动配置Url前缀
- 06.参数校验机制与LomBok工具集的使用
- 第1章 LomBok工具集的使用
- 第2章 参数校验机制以及自定义校验
- 07.项目分层设计与JPA技术
- 第1章 项目分层原则与层与层的松耦合原则
- 第2章 数据库设计、实体关系与查询方案探讨
- 第3章 JPA的关联关系与规则查询
- 08.ORM的概念与思维
- 第1章 ORM的概念与思维
- 第2章 Banner等相关业务
- 第3章 再谈数据库设计技巧与VO层对象的技巧
- 09.JPA的多种查询规则
- 第1章 DozerBeanMapper的使用
- 第2章 详解SKU的规格设计
- 第3章 通用泛型Converter
- 10.令牌与权限
- 第1章 通用泛型类与java泛型的思考
- 常见问题
- 微服务
- demo
- PHP中Self、Static和parent的区别
- Swoole-Cli
- 为什么要使用现代化PHP框架?
- 公众号
- 一键部署微信公众号Markdown编辑器(支持适配和主题设计)
- Autodesigner 2.0发布
- Luya 一个现代化PHP开发框架
- PHPZip - 创建、读取和管理 ZIP 文件的简单库
- 吊打Golang的PHP界天花板webman压测对比
- 简洁而强大的 YAML 解析库
- 推荐一个革命性的PHP测试框架:Kahlan
- ServBay下一代Web开发环境
- 基于Websocket和Canvas实现多人协作实时共享白板
- Apipost预执行脚本如何调用外部PHP语言
- 认证和授权的安全令牌 Bearer Token
- Laradock PHP 的 Docker 完整本地开发环境
- 高效接口防抖策略,确保数据安全,避免重复提交的终极解决方案!
- TIOBE 6月榜单:PHP稳步前行,编程语言生态的微妙变化
- Aho-Corasick字符串匹配算法的实现
- Redis键空间通知 Keyspace Notification 事件订阅
- ServBay如何启用并运行Webman项目
- 使用mpdf实现导出pdf文件功能
- Medoo 轻量级PHP数据库框架
- 在PHP中编写和运行单元测试
- 9 PHP运行时基准性能测试
- QR码生成器在PHP中的源代码
- 使用Gogs极易搭建的自助Git服务
- Gitea
- webman如何记录SQL到日志?
- Sentry PHP: 实时监测并处理PHP应用程序中的错误
- Swoole v6 Alpha 版本已发布
- Proxypin
- Rust实现的Redis内存数据库发布
- PHP 8.4.0 Alpha 1 测试版本发布
- 121
- Golang + Vue 开发的开源轻量 Linux 服务器运维管理面板
- 内网穿透 FRP VS Tailscale
- 新一代开源代码托管平台Gitea
- 微服务系列
- Nacos云原生配置中心介绍与使用
- 轻量级的开源高性能事件库libevent
- 国密算法
- 国密算法(商用密码)
- GmSSL 支持国密SM2/SM3/SM4/SM9/SSL 密码工具箱
- GmSSL PHP 使用
- 数据库
- SQLite数据库的Web管理工具
- 阿里巴巴MySQL数据库强制规范
- PHP
- PHP安全测试秘密武器 PHPGGC
- 使用declare(strict_types=1)来获得更健壮的PHP代码
- PHP中的魔术常量
- OSS 直传阿里腾讯示例
- PHP源码编译安装APCu扩展实现数据缓存
- BI性能DuckDB数据管理系统
- 为什么别人可以是架构师!而我却不是?
- 密码还在用 MD5 加盐?不如试试 password_hash
- Elasticsearch 在电商领域的应用与实践
- Cron 定时任务入门
- 如何动态设置定时任务!而不是写死在Linux Crontab
- Elasticsearch的四种查询方式,你知道多少?
- Meilisearch vs Elasticsearch
- OpenSearch vs Elasticsearch
- Emlog 轻量级开源博客及建站系统
- 现代化PHP原生协程引擎 PRipple
- 使用Zephir编写C扩展将PHP源代码编译加密
- 如何将PHP源代码编译加密,同时保证代码能正常的运行
- 为什么选择Zephir给PHP编写动态扩展库?
- 使用 PHP + XlsWriter实现百万级数据导入导出
- Rust编写PHP扩展
- 阿里云盘开放平台对接进行文件同步
- 如何构建自己的PHP静态可执行文件
- IM后端架构
- RESTful设计方法和规范
- PHP编译器BPC 7.3 发布,成功编译ThinkPHP8
- 高性能的配置管理扩展 Yaconf
- PHP实现雪花算法库 Snowflake
- PHP官方现代化核心加密库Sodium
- pie
- 现代化、精简、非阻塞PHP标准库PSL
- PHP泛型和集合
- 手把手教你正确使用 Composer包管理
- JWT双令牌认证实现无感Token自动续期
- 最先进PHP大模型深度学习库TransformersPHP
- PHP如何启用 FFI 扩展
- PHP超集语言PXP
- 低延迟双向实时事件通信 Socket.IO
- PHP OOP中的继承和多态
- 强大的现代PHP高级调试工具Kint
- PHP基金会
- 基于webman+vue3高质量中后台框架SaiAdmin
- 开源免费的定时任务管理系统:Gocron
- 简单强大OCR工具EasyOCR在PHP中使用
- PHP代码抽象语法树工具PHP AST Viewer
- MySQL数据库管理工具PHPMyAdmin
- Rust编写的一款高性能多人代码编辑器Zed
- 超高性能PHP框架Workerman v5.0.0-beta.8 发布
- 高并发系列
- 入门介绍及安装
- Lua脚本开发 Hello World
- 执行流程与阶段详解
- Nginx Lua API 接口开发
- Lua模块开发
- OpenResty 高性能的正式原因
- 记一次查找 lua-resty-mysql 库 insert_id 的 bug
- 包管理工具OPM和LuaRocks使用
- 异步非阻塞HTTP客户端库 lua-resty-http
- Nginx 内置绑定变量
- Redis协程网络库 lua-resty-redis
- 动态HTML渲染库 lua-testy-template
- 单独的
- StackBlitz在线开发环境
- AI
- 基础概念
- 12312
- 基础镜像的坑
- 利用phpy实现 PHP 编写 Vision Transformer (ViT) 模型
- 语义化版本 2.0.0