类似Elasticsearch搜索引擎项目的比较

搜索引擎是一种可以搜索已被全文索引的数据中的任何文本的软件。虽然有 Google 和 Bing 等公共搜索引擎,但我们在本博客中讨论的不是它们,而是允许您在自己的数据中搜索文本的软件。将此类搜索引擎软件想象为 google 或 bing,但仅用于您自己的数据。

什么是 Elasticsearch/OpenSearch?
Elasticsearch 是一款创建于 2000 年底的搜索引擎,由开发和推广该产品的 Elastic(2012 年成立)支持。它还提供托管 Elasticsearch 服务。

2021 年 1 月,Elastic 将 Elasticsearch 的许可从 Apache 2.0 更改为 SSPL(非 OSI 批准的开源许可)。因此,AWS、logz.io 和其他公司创建了 Elasticsearch 的最新 Apache 2.0 开源版本(版本 7.10.2)的分支。

OpenSearch 是开源的 (Apache 2.0),也作为托管服务提供 (Amazon OpenSearch)。

它相当重。它至少需要 0.5 GB RAM 才能启动,并且由于 JVM 的使用,可能需要多个 GB 字节的 RAM 才能正常运行。我不太喜欢用 Java 构建的东西,主要是因为 JVM 资源需求。此外,您还需要学习许多配置参数才能很好地利用它。

搜索引擎的类型
其中一种用于应用程序进行超快速搜索(内存中搜索),另一种用于磁盘上的大量数据(磁盘上搜索仍然相当快)。

1.类型1 - 内存搜索引擎
这些搜索引擎将索引存储在内存中,使得搜索速度超级快。Algolia、Meilisearch 和typsesnse 是这一类别中不错的软件/服务。即时搜索(当您键入或预先输入时)是此类搜索引擎的一个流行用例。它们提供超快的低于 50 毫秒的响应,当您构建需要搜索少量数据(不像日志那样只有几 GB,但仍然是数百万条记录)的应用程序时,它们是绝佳的选择。

对于这些搜索引擎来说,日志搜索并不是一个很好的用例,因为所有内容都会加载到内存中,并且您将需要快速的大型搜索器。不过,这些都有自己的利基。

2. 类型 2 - 磁盘搜索引擎
此类别中的一些示例包括 Elasticsearch/OpenSearch、manticore、sphinx。此类搜索引擎在磁盘上的大量数据(可以是多个 TB)上搜索数据。这些在响应方面没有那么快,但对于很多用例来说仍然相当快。良好的设置可以让您在 100 毫秒内搜索数 GB 的数据,这对于许多应用程序来说非常好。


内存中搜索引擎:
1. Algolia
非常棒的搜索服务,有很多流行的用例和大量的用户。它仅作为服务提供,您不能将其托管在您自己的服务器上。定价基于记录数量和搜索量,并且存储大量数据对于大多数情况来说成本高昂。它有很多连接器,可以轻松插入您的应用程序中。Algolia 还创建了一个名为 instantsearch.js 的 JavaScript 库,这使得在 Web 应用程序中开发 UI 变得更加容易。

2. Typesense
Typesense是一个用 c++ 从头开始​​创建的开源 (AGPL) 搜索引擎。它非常快并且不会消耗大量资源。Docker 镜像对于自托管场景的可用性非常棒。它还可以使用我创建的 kustomize 清单以 HA 模式安装在 kubernetes 中。设置 Typesense 非常简单,并且性能很高。它使用 raft 进行 HA。Typesense 还提供完全托管的云服务。

3.Meilisearch
Meilisearch 是另一个用 Rust 编写的开源搜索引擎,它是以算法为灵感构建的。它与 typesense 非常相似,但还没有 HA 模式。因此,如果您正在寻找高度可用的弹性服务,meilisearch 不会削减它(只是还没有)。


磁盘搜索引擎:
1.Elasticsearch/OpenSearch
Elasticsearch/OpenSearch是该类别中最受欢迎的搜索引擎。Elasticsearch/OpenSearch 构建在 Apache Lucene 之上,Apache Lucene 是一个用 Java 编写的搜索引擎库。它可以在HA模式下运行,并且人们已经运行了具有100多个节点的集群。

2.Apache Solr
Apache Solr也构建在 Lucene 之上,具有与 Elasticsearch 相当的功能。它还利用 Apache Tika 提取 .doc 和 .pdf 等文档并为其建立索引。在最初的日子里,需要严格的模式,但现在不再需要了。因此,如果您正在寻找索引文件文档(.doc、xls、pdf...),那么 Apache solr 是最佳选择。提供HA模式以实现可靠运行。

3. Sphinx
Sphinx是开源的 (GPL 2),用 C++ 编写。它是部分开源的,因为此时旧版本 (2.0) 是开源的,但最新版本 3 是闭源的。

4. Manticore
用 C++ 编写的Manticore是另一个开源 (GPL 2) 搜索引擎,它具有首先使用 SQL 进行搜索的有趣方法。它可以通过 HTTP 或 MySQL 协议使用 SQL。通过同步复制提供HA模式。

5.Sonic
用 Rust 编写的Sonic是另一个开源 (MPL) 搜索引擎。与其他搜索引擎相比,显着的区别是它不存储索引的整个文档。当您搜索时,它将返回文档的 ID,您必须使用该 ID 从另一个数据存储中获取整个文档。这就需要至少再一个数据存储来保存实际数据。这可能是也可能不是一个很好的场景,具体取决于您的用例。如果您已经在 MySQL/Postgres/DynamoDB 等其他存储中拥有数据,那么 sonic 就很棒,但是如果您希望将数据直接提取到 sonic 中,那么您就会遇到问题,sonic 不会为您工作。

与其他搜索引擎的另一个区别是 Sonic 不提供 http 接口。它提供了可用于与 sonic 交互的 sonic 协议。客户端库可用于多种语言。

6. Quickwit
Quickwit 基于 tantivy,分享了 tantivy 的优点(高性能)和挑战(严格的 schema 要求)。它还将数据存储在 s3 上,解耦存储和计算,这有点不错。

边缘项目
这些是个人的小型业余爱好项目,似乎主要是为了学习而开发的。

  • Toshi是一个在 tantivy 之上开发的搜索引擎,因此它具有与 tantivy 相同的优点和缺点 - 主要是良好的速度和严格的模式。
  • Bayard建在坦蒂维之上。与托西类似。
  • Blast建立在 bleve 之上并且是分布式的。
  • Riot现已存档。

索引库
关于索引库的一点说明。请记住,您不能使用任何现成的,因为这些是库而不是真正的应用程序。通常,您只能(并非总是但大多数)在编写它们的语言中使用它们。

  • Lucene是最流行的 Java 库,它提供索引功能。人们已经直接在他们的 java 应用程序中使用它。Elasticsearch 和 Apache Solr 的核心都使用 Lucene。Lucene 不强制执行严格的模式。
  • Tantivy是非常快的索引库,需要严格的模式。对于某些应用程序来说,严格的架构要求可能会出现问题。
  • Bleve是在 couchbase 创建的,是一个非常受欢迎的库。
  • Bluge由Bleve的创建者Marty创建,是Bleve的继承者。如果您要开始新项目,那么您应该从 Bluge 开始。Bluge 使用起来非常简单,并且具有一系列良好的功能,例如其他软件所缺乏的基于磁盘和内存中的索引。再加上非常低的资源要求,Bluge 是大多数应用程序的绝佳选

C++


什么是Zinc?
Zinc是一个用于对文档进行全文搜索的搜索引擎。它是开源的并且用 Go 构建。Zinc不是从头开始构建索引引擎,而是构建在 bluge(一个出色的索引库)之上。

特性:

  1. 无模式索引
  2. 资源利用率低
  3. 易于使用的轻量级 GUI
  4. 内置身份验证
  5. 用于编程使用的简单 API
  6. 与 Elasticsearch API(摄取 - 单记录和批量 API)的兼容性,适用于想要从 Elasticsearch 迁移到 Zinc 的应用程序。