与其他搜索引擎比较
网络上有很多搜索引擎,包括开源的和非开源的。决定哪种搜索解决方案最适合您的项目非常重要,但也很困难。在本文中,我们将介绍 Meilisearch 和其他搜索引擎之间的差异
-
在比较表格中,我们概述了 Meilisearch 和其他搜索引擎之间的差异
-
在方法比较中,我们关注的是 Meilisearch 在ElasticSearch和Algolia等两个目前市场上最大的解决方案中与它们的对比
-
最后,我们以对搜索引擎全景的深度分析作为本文的结尾。
注意
请注意,下面描述的很多搜索产品都在不断发展,就像 Meilisearch 一样。这些仅仅是我们自己的看法,并可能无法反映最近的变更。如果某处看起来有误,请随时提出问题或 pull 请求。
对比表
总体概述
Meilisearch | Algolia | Typesense | Elasticsearch | |
---|---|---|---|---|
源代码许可 | MIT (完全开源) | 闭源 | GPL-3 (完全开源) | SSPL (不是开源) |
开发工具 | Rust 了解我们为何如此信赖 Rust. | C++ | C++ | Java |
数据存储 | 磁盘和内存映射——不受 RAM 限制 | 受限于 RAM | 受限于 RAM | 带 RAM 缓存的磁盘 |
特性
集成和 SDK
注意:我们仅列出每个搜索引擎的内部团队正式支持的库。
找不到我们支持的客户端?提交您的构想或投票 😇
SDK | Meilisearch | Algolia | Typesense | Elasticsearch |
---|---|---|---|---|
REST API | ✅ | ✅ | ✅ | ✅ |
JavaScript 客户端 | ✅ | ✅ | ✅ | ✅ |
PHP 客户端 | ✅ | ✅ | ✅ | ✅ |
Python 客户端 | ✅ | ✅ | ✅ | ✅ |
Ruby 客户端 | ✅ | ✅ | ✅ | ✅ |
Java 客户端 | ✅ | ✅ | ✅ | ✅ |
Swift 客户端 | ✅ | ✅ | ✅ | ❌ |
.NET 客户端 | ✅ | ✅ | ✅ | ✅ |
Rust 客户端 | ✅ | ❌ | 🔶 正在建设中 | ✅ |
Go 客户端 | ✅ | ✅ | ✅ | ✅ |
Dart 客户端 | ✅ | ✅ | ✅ | ❌ |
Symfony | ✅ | ✅ | ✅ | ❌ |
Django | ❌ | ✅ | ❌ | ❌ |
Rails | ✅ | ✅ | 🔶 正在建设中 | ✅ |
官方 Laravel Scout 支持 | ✅ | ✅ | ❌ 作为独立模块提供 | ❌ 作为独立模块提供 |
Instantsearch | ✅ | ✅ | ✅ | ✅ |
自动完成输入 | ✅ | ✅ | ✅ | ✅ |
Docsearch | ✅ | ✅ | ✅ | ❌ |
Strapi | ✅ | ✅ | ❌ | ❌ |
Gatsby | ✅ | ✅ | ✅ | ❌ |
Firebase | ✅ | ✅ | ✅ | ❌ |
配置
文档模式
Meilisearch | Algolia | Typesense | Elasticsearch | |
---|---|---|---|---|
无模式 | ✅ | ✅ | 🔶id 字段是必需的,并且必须是一个字符串 | ✅ |
支持嵌套字段 | ✅ | ✅ | ✅ | ✅ |
嵌套文档查询 | ❌ | ❌ | ❌ | ✅ |
自动检测文档 ID | ✅ | ❌ | ❌ | ❌ |
原生文档格式 | JSON , NDJSON , CSV | JSON | NDJSON | JSON , NDJSON , CSV |
支持压缩 | Gzip、Deflate 和 Brotli | Gzip | ❌ 将有效负载读取为 JSON,这可能导致文档损坏 | Gzip |
相关性
Meilisearch | Algolia | Typesense | Elasticsearch | |
---|---|---|---|---|
容错键入 | ✅ | ✅ | ✅ | 🔶 需要通过模糊查询指定 |
可排序排名规则 | ✅ | ✅ | 🔶 可以更改字段权重,但不能更改排名规则顺序。 | ❌ |
自定义排名规则 | ✅ | ✅ | ✅ | 🔶 函数得分查询 |
查询字段权重 | ✅ | ✅ | ✅ | ✅ |
同义词 | ✅ | ✅ | ✅ | ✅ |
停用词 | ✅ | ✅ | ❌ | ✅ |
自动语言检测 | ✅ | ✅ | ❌ | ❌ |
支持所有语言 | ✅ | ✅ | ✅ | ✅ |
排名评分详情 | ✅ | ✅ | ❌ | ✅ |
安全
Meilisearch | Algolia | Typesense | Elasticsearch | |
---|---|---|---|---|
API 密钥管理 | ✅ | ✅ | ✅ | ✅ |
租户令牌与多租户索引 | ✅ 支持多租户 | ✅ | ✅ | ✅ 基于角色 |
搜索
Meilisearch | Algolia | Typesense | Elasticsearch | |
---|---|---|---|---|
占位符搜索 | ✅ | ✅ | ✅ | ✅ |
多索引搜索(联合搜索) | ✅ | ✅ | ✅ | ✅ |
确切短语搜索 | ✅ | ✅ | ✅ | ✅ |
地理搜索 | ✅ | ✅ | ✅ | ✅ |
排序依据 | ✅ | 🔶 每个索引仅限一条 sort_by 规则。可能需要为每个排序字段和排序顺序重复索引 | ✅ 每个搜索查询最多 3 个排序字段 | ✅ |
过滤 | ✅ 使用类似 SQL 的语法支持复杂过滤器查询。 | 🔶 不支持跨多个字段的 OR 操作 | ✅ | ✅ |
分面搜索 | ✅ | ✅ | ✅ 分面字段必须可搜索 当需要返回 >1000 万个分面值时,分面可能需要几秒钟时间 | ✅ |
唯一属性 按字段值对文档进行重复数据删除 | ✅ | ✅ | ✅ | ✅ |
分组 按字段值对文档进行分组 | ❌ | ✅ | ✅ | ✅ |
人工智能搜索
Meilisearch | Algolia | Typesense | Elasticsearch | |
---|---|---|---|---|
语义搜索 | ✅ | 🔶 受高级计划约束 | ✅ | ✅ |
混合搜索 | ✅ | 🔶 受高级计划约束 | ✅ | ✅ |
嵌入生成 | ✅ OpenAI Hugging Face RES 嵌入器 | 未披露 | OpenAI GCP Vertex AI | ❌ |
提示模板 | ✅ | 未披露 | ❌ | ❌ |
向量存储 | ✅ | 未披露 | ✅ | ✅ |
Langchain 集成 | ✅ | ❌ | ✅ | ✅ |
GPU 支持 | ✅ CUDA | 未披露 | ✅ CUDA | ❌ |
可视化
部署
Meilisearch | Algolia | Typesense | Elasticsearch | |
---|---|---|---|---|
自托管 | ✅ | ❌ | ✅ | ✅ |
平台支持 | ARM x86 x64 | 不适用 | 🔶 ARM(需要 macOS 上的 Docker) x86 x64 | ARM x86 x64 |
官方一键部署 | ✅ DigitalOcean Platform.sh Azure Railway Koyeb | ❌ | 🔶 仅适用于云托管解决方案 | ❌ |
官方云托管解决方案 | Meilisearch Cloud | ✅ | ✅ | ✅ |
高可用性 | 与 Meilisearch Cloud 一起使用 | ✅ | ✅ | ✅ |
运行时依赖项 | 无 | 不适用 | 无 | 无 |
向后兼容性 | ✅ | 不适用 | ✅ | ✅ |
升级路径 | 升级时自动重新索引文档 | 不适用 | 升级时自动重新索引文档 | 最高支持 1 个主版本,升级时自动重新索引文档 |
限制
Meilisearch | Algolia | Typesense | Elasticsearch | |
---|---|---|---|---|
索引最大数量 | 无限制 | 1000,联系支持可以提高此限制 | 无限制 | 无限制 |
索引最大大小 | 80TiB | 128GB | 受制于 RAM 限制 | 无限制 |
每个属性的最大单词数 | 无限制 | 无限制 | 无限制 | 无限制 |
文档最大大小 | 无限制 | 100KB,可配置 | 无限制 | 默认 100KB,可配置 |
社区
Meilisearch | Algolia | Typesense | Elasticsearch | |
---|---|---|---|---|
主项目的 GitHub stars | 4.2 万 | 不适用 | 1.7 万 | 6.6 万 |
主项目的贡献者人数 | 179 | 不适用 | 38 | 1,900 |
公开 Discord/Slack 社区规模 | 2,100 | 不适用 | 2,000 | 1.6 万 |
支持
Meilisearch | Algolia | Typesense | Elasticsearch | |
---|---|---|---|---|
状态页面 | ✅ | ✅ | ✅ | ✅ |
免费支持渠道 | 即时消息/聊天框(2-3 小时延迟), 电子邮件, 公开 Discord 社区, GitHub 问题和讨论 | 即时消息/聊天框, 公开社区论坛 | 即时消息/聊天框(24 小时至 48 小时延迟), 公开 Slack 社区, GitHub 问题。 | 公开 Slack 社区, 公开社区论坛, GitHub 问题 |
付费支持渠道 | 支持是免费的! | 电子邮件 | 电子邮件, 电话, 私有 Slack | Web 支持, 电子邮件, 电话 |
方式对比
Meilisearch 与 Elasticsearch
Elasticsearch 被设计为后端搜索引擎。尽管它不适用于此目的,但它通常用于为最终用户构建搜索栏。
Elasticsearch 可以处理对海量数据进行搜索和执行文本分析。为了能使它对最终用户搜索有效,你需要花时间更多地理解 Elasticsearch 如何在内部工作,以便能够自定义它并定制它以适应你的需求。
与 Elasticsearch 不同,Elasticsearch 是专为大量日志数据(例如,向后搜索)设计的通用搜索引擎,Meilisearch 旨在提供面向最终用户(例如,面向用户的搜索)的高性能即时搜索体验。
如果你想提供完整的即时搜索体验,Elasticsearch 有时可能会太慢。在返回搜索结果方面,它在与 Meilisearch 的比较中很多时候会显著较慢。
如果你需要一个简单易用的工具来部署容错搜索栏,Meilisearch 是一个完美的选择。它提供了前缀搜索能力,使用户搜索直观,并开箱即用地以极好的相关性即时返回结果。
有关如何将其与 Meilisearch 进行比较的更详细分析,请参阅我们的Elasticsearch 博客文章。
Meilisearch 与 Algolia
Meilisearch 的灵感来自 Algolia 的产品和背后的算法。我们确实研究了他们博客文章中描述的大多数算法和数据结构,以便实现我们自己的算法。因此,Meilisearch 是一款基于 Algolia 的工作和最近的研究论文的新搜索引擎。
Meilisearch 提供了相似的功能,并与竞争对手一样快速地达到了相同级别的相关性。
如果你是一位正在考虑改用 Meilisearch 的当前 Algolia 用户,你可能会对我们的迁移指南感兴趣。
关键相似之处
Algolia 和 Meilisearch 之间的一些最重要的相似之处是
- 功能,如键入时搜索、容错、分面等。
- 针对即时搜索体验的快速结果(答案 < 50 毫秒)
- 无模式索引
- 支持所有 JSON 数据类型
- 异步 API
- 类似的查询响应
关键区别
与 Algolia 相反,Meilisearch 是开源的,可以分支或自托管。
此外,Meilisearch 是用 Rust 写成的,Rust 是一门现代的系统级编程语言。Rust 提供了速度、可移植性和灵活性,这使得我们的搜索引擎在虚拟机、容器,甚至 Lambda@Edge 中进行部署时,可以实现无缝运行。
价格
Algolia 定价模式 根据保留记录的数量和执行的 API 操作数量而定。对于中小型企业而言,它可能非常昂贵。
Meilisearch 是一款开源搜索引擎,可通过 Meilisearch Cloud 获取,或进行自托管。与 Algolia 不同的是,Meilisearch 的定价 根据存储的文档数量和执行的搜索操作数量而定。但 Meilisearch 提供了更宽松的免费层级,允许存储更多文档以及提供更公平的搜索使用定价。Meilisearch 还提供了一个专业层级,用于更大的使用案例,以实现更有保证的定价。
快速了解搜索引擎领域
开源
Lucene
Apache Lucene 是一个免费且开源的搜索库,用于全文文档的索引和搜索。它由道格·卡廷在 1999 年创建,道格·卡廷之前曾在施乐的帕洛阿尔托研究中心 (PARC) 和 Apple 编写搜索引擎。Lucene 用 Java 编写,用于构建 Google 和 DuckDuckGo 等网络搜索应用程序,后者仍然在特定类型的搜索中使用 Lucene。
Lucene 之后被分成了几个项目
- Lucene 本身:全文搜索库。
- Solr:一款带有强大 REST API 的企业搜索服务器。
- Nutch:一个可扩展且可伸缩的网络爬虫,依赖于 Apache Hadoop。
由于 Lucene 是许多开源或闭源搜索引擎背后的技术,因此它被视为参考搜索库。
Sonic
Sonic 是一个用 Rust 编写的小型无模式搜索索引服务器。Sonic 不能被视为一个开箱即用的解决方案,与 Meilisearch 相比,它不确保相关性排名。它不是存储文档,而是包含一个带 Levenshtein 自动机的倒排索引。这意味着任何查询 Sonic 的应用程序都必须使用返回的 ID 从外部数据库中检索搜索结果,然后应用一些相关性排名。
它能够在几兆字节的 RAM 上运行,这使其成为可以太过于消耗资源而无法扩展的数据库工具的精简且高效的替代品。
Typesense
与 Meilisearch 类似,Typesense 是一个针对速度进行了优化的轻量级开源搜索引擎。要更好地理解它与 Meilisearch 的比较,请参阅我们的有关 Typesense 的博客文章。
Lucene 派生
Lucene-Solr
Solr 是 Apache Lucene 的一个子项目,由 Yonik Seeley 于 2004 年创建,现在是全球使用最广泛的搜索引擎之一。Solr 是用 Java 编写的一个搜索平台,建立在 Lucene 之上。换句话说,Solr 是 Lucene Java API 的一个 HTTP 封装,这意味着你可以通过使用它来利用 Lucene 的所有特性。此外,Solr 服务器与 Solr Cloud 结合,提供了分布式索引和搜索功能,从而确保了高可用性和可伸缩性。数据共享但也会自动复制。此外,Solr 不仅是一个搜索引擎,它还经常被用作文档结构 NoSQL 数据库。文档存储在集合中,这可以与关系数据库中的表相比较。
由于其可扩展的插件架构和可自定义的功能,Solr 是一个用途广泛的搜索引擎,即使它可以索引和搜索文档和电子邮件附件,但由于它可以索引和搜索文档和电子邮件附件,它尤其适用于企业搜索。
Bleve 和 Tantivy
Bleve 和 Tantivy 是搜索引擎项目,分别用 Golang 和 Rust 编写,灵感来自 Apache Lucene 和它的算法(例如,tf-idf,即 term frequency-inverse document frequency)。比如 Lucene,两者都是可用于任何搜索项目的库;但是它们不是开箱即用的 API。
源代码公开
Elasticsearch
Elasticsearch 是基于 Lucene 库的搜索引擎,因全文搜索而广受欢迎。它提供了一个通过 HTTP 访问 JSON 的 REST API。其关键选项之一称为索引分片,它让你能够将索引划分成物理空间,以提高性能并保证高可用性。Lucene 和 Elasticsearch 均设计用于处理海量数据流、分析日志以及运行复杂查询。你可以对与特定查询匹配的文档执行操作和分析(例如,计算所有名为“Thomas”的用户平均年龄)。
如今,Lucene 和 Elasticsearch 在搜索引擎领域占据主导地位。它们都是针对搜索中大量不同的使用案例以及构建你自己的推荐引擎的可靠解决方案。它们是不错的通用产品,但需要正确配置才能获得与 Meilisearch 或 Algolia 相似的结果。
源代码闭源
Algolia
Algolia 是一家提供 SaaS 模式搜索引擎的公司。其软件采用闭源。在早期阶段,Algolia 提供了可嵌入在应用中的移动搜索引擎,面临着从零开始实现搜索算法的挑战。从一开始,就决定构建一个直接专注于最终用户的搜索引擎,特别是针对移动应用或网站实施搜索。在过去几年中,Algolia 成功展示了容忍拼写错误对改善用户体验的重要性,同样展示了其对减少跳出率和提高转化率的影响。
除了 Algolia,搜索引擎市场还提供多种 SaaS 产品可供选择。它们中的大多数使用 Elasticsearch 并对其设置进行微调,以便拥有定制且个性化的解决方案。
Swiftype
Swiftype 是一家专业从事网站搜索和分析的搜索服务提供商。Swiftype 由 Matt Riley 和 Quin Hoxie 于 2012 年创立,现归 Elastic 所有(自 2017 年 11 月起)。它是一种构建在 Elasticsearch 之上的端到端解决方案,这意味着它能够利用 Elastic 堆栈。
Doofinder
Doofinder 是一款付费的现场搜索服务,开发用于以极少的配置集成到任何网站中。Doofinder 由在线商店使用以增加其销售额,目标是简化购买流程。
结论
每个搜索解决方案最适合特定用例的约束。由于每种类型的搜索引擎提供一组独特的特性,因此比较它们的性能既不简单也不相关。例如,在基于产品的数据库上对 Elasticsearch 和 Algolia 进行速度比较是不公平的。基于全文的大型数据库也是如此。
因此,我们不能将自己与基于 Lucene 或针对特定任务的其他搜索引擎进行比较。
在我们所涵盖的特定用例中,与 Meilisearch 最相似的解决方案是 Algolia。
虽然 Algolia 提供最先进且功能强大的搜索特性,但这种效率带来了昂贵的价格。此外,他们的服务是针对大公司的营销。
Meilisearch 致力于服务所有类型的开发者。我们的目标是提供一款对开发者友好的工具,易于安装和部署。由于为最终用户提供开箱即用的出色搜索体验对我们很重要,我们希望以最少的精力和不需任何财务资源为每个人提供最佳搜索体验。
通常,当开发者寻找要集成到其应用程序中的搜索工具时,他们会选择 ElasticSearch 或效果较差的选择。即使 Elasticsearch 不太适合此用例,它仍然是现成的优质可用解决方案。但是,它需要技术诀窍才能执行高级特性,而且需要更多时间才能将其定制到企业中。
我们的目标是成为开发者的默认解决方案。