与其他方案的比较
为项目选择搜索引擎是一项重要但困难的任务。本文描述了 Meilisearch 与其他搜索引擎的区别。
网络上有许多搜索引擎,既有开源的也有商业的。为项目选择合适的搜索解决方案非常重要,但也颇具挑战性。本文将详细对比 Meilisearch 与其他搜索引擎的差异:
-
对比表格 部分,我们将概述 Meilisearch 与其他搜索引擎的主要区别
-
方法对比 部分,我们会重点分析 Meilisearch 与当前市场上两大主流方案 ElasticSearch 和 Algolia 的优劣
-
最后,我们将以 对搜索引擎生态的深度分析 结束本文
请注意,下文描述的许多搜索产品(包括 Meilisearch)都在持续演进。本文仅代表我们的观点,可能无法反映最新变化。如发现任何不准确之处,欢迎提交 issue 或 pull request。
对比表格
总体概览
Meilisearch | Algolia | Typesense | Elasticsearch | |
---|---|---|---|---|
源代码许可 | MIT (完全开源) | 闭源 | GPL-3 (完全开源) | AGPLv3 (开源) |
开发语言 | 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 | ✅ | ✅ | ✅ | ✅ | |
Autocomplete | ✅ | ✅ | ✅ | ✅ | |
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万个分面值时可能需要数秒 | ✅ |
去重属性 通过字段值去重文档 | ✅ | ✅ | ✅ | ✅ |
分组功能 按字段值对文档进行分桶 | ❌ | ✅ | ✅ | ✅ |
AI增强搜索对比
Meilisearch | Algolia | Typesense | Elasticsearch | |
---|---|---|---|---|
语义搜索 | ✅ | 🔶 仅限高级套餐 | ✅ | ✅ |
混合搜索 | ✅ | 🔶 仅限高级套餐 | ✅ | ✅ |
嵌入生成 | ✅ OpenAI HuggingFace REST嵌入器 | 未公开 | OpenAI GCP Vertex AI | ✅ ELSER E5 Cohere OpenAI Azure Google AI Studio Hugging Face |
提示模板 | ✅ | 未公开 | ❌ | ❌ |
向量存储 | ✅ | 未公开 | ✅ | ✅ |
Langchain集成 | ✅ | ❌ | ✅ | ✅ |
GPU支持 | ✅ CUDA | 未公开 | ✅ CUDA | ❌ |
可视化功能对比
Meilisearch | Algolia | Typesense | Elasticsearch | |
---|---|---|---|---|
Mini Dashboard | ✅ | 🔶 云服务产品 | 🔶 云服务产品 | ✅ |
搜索分析 | ✅ 云服务产品 | ✅ 云服务产品 | ❌ | ✅ 云服务产品 |
监控仪表盘 | ✅ 云服务产品 | ✅ 云服务产品 | ✅ 云服务产品 | ✅ 云服务产品 |
部署方式
Meilisearch | Algolia | Typesense | Elasticsearch | |
---|---|---|---|---|
自托管 | ✅ | ❌ | ✅ | ✅ |
平台支持 | ARM x86 x64 | 不适用 | 🔶 ARM (macOS 需 Docker) x86 x64 | ARM x86 x64 |
官方一键部署 | ✅ DigitalOcean Platform.sh Azure Railway Koyeb | ❌ | 🔶 仅限云托管方案 | ❌ |
官方云托管方案 | Meilisearch 云服务 | ✅ | ✅ | ✅ |
高可用性 | 通过 Meilisearch 云服务提供 | ✅ | ✅ | ✅ |
运行时依赖 | 无 | 不适用 | 无 | 无 |
向后兼容 | ✅ | 不适用 | ✅ | ✅ |
升级路径 | 升级时自动重建索引 | 不适用 | 升级时自动重建索引 | 升级时自动重建索引(最多支持1个大版本) |
限制对比
Meilisearch | Algolia | Typesense | Elasticsearch | |
---|---|---|---|---|
最大索引数量 | 无限制 | 1000(可联系支持团队提升限额) | 无限制 | 无限制 |
最大索引大小 | 80TiB | 128GB | 受内存限制 | 无限制 |
单文档最大尺寸 | 无限制 | 100KB(可配置) | 无限制 | 默认100KB(可配置) |
社区生态
Meilisearch | Algolia | Typesense | Elasticsearch | |
---|---|---|---|---|
主项目GitHub星标数 | 42K | 不适用 | 17K | 66K |
主项目贡献者数量 | 179 | 不适用 | 38 | 1,900 |
公开Discord/Slack社区规模 | 2,100 | 不适用 | 2,000 | 16K |
支持服务
Meilisearch | Algolia | Typesense | Elasticsearch | |
---|---|---|---|---|
状态页面 | ✅ | ✅ | ✅ | ✅ |
免费支持渠道 | 即时通讯/聊天框(2-3小时响应)、 电子邮件、 公开Discord社区、 GitHub问题讨论区 | 即时通讯/聊天框、 公开社区论坛 | 即时通讯/聊天框(24-48小时响应)、 公开Slack社区、 GitHub问题区 | 公开Slack社区、 公开社区论坛、 GitHub问题区 |
付费支持渠道 | Slack专属频道、电子邮件、个性化支持——按需定制! | 电子邮件 | 电子邮件、 电话、 私有Slack通道 | 在线支持、 电子邮件、 电话 |
技术方案对比
Meilisearch 与 Elasticsearch 对比
Elasticsearch 是作为后端搜索引擎设计的。虽然它并不适合这个用途,但常被用来为终端用户构建搜索栏。
Elasticsearch 能够处理海量数据的搜索和文本分析。但要想让它有效地服务于终端用户搜索,你需要花时间深入了解 Elasticsearch 的内部工作原理,才能进行定制和调整以满足需求。
与作为通用搜索引擎(专为大量日志数据设计,例如后端搜索)的 Elasticsearch 不同,Meilisearch 旨在为终端用户提供高性能的即时搜索体验(例如前端搜索)。
如果要提供完整的即时搜索体验,Elasticsearch 有时会显得过于缓慢。大多数情况下,它的搜索结果返回速度明显慢于 Meilisearch。
如果你需要一个简单易用的工具来部署支持容错输入的搜索栏,Meilisearch 是完美选择。它提供前缀搜索能力,让搜索对用户更直观,并能即时返回开箱即用的高相关性结果。
要了解更详细的对比分析,请参阅我们关于 Elasticsearch 的博客文章。
Meilisearch 与 Algolia 对比
Meilisearch 的灵感来源于 Algolia 的产品及其背后的算法。我们确实研究了他们博客中描述的大部分算法和数据结构,以实现我们自己的版本。因此,Meilisearch 是一个基于 Algolia 工作和最新研究论文的新型搜索引擎。
Meilisearch 提供了类似的功能,并且能像其竞争对手一样快速达到相同的相关性水平。
如果您是目前正在考虑从 Algolia 切换到 Meilisearch 的用户,可能会对我们的迁移指南感兴趣。
主要相似点
Algolia 和 Meilisearch 之间一些最重要的相似之处包括:
- 功能特性如输入即搜索(search-as-you-type)、错字容忍(typo tolerance)、分面搜索(faceting)等
- 针对即时搜索体验的快速响应(响应时间 < 50 毫秒)
- 无模式索引(Schemaless indexing)
- 支持所有 JSON 数据类型
- 异步 API
- 相似的查询响应结构
主要差异
与 Algolia 不同,Meilisearch 是开源的,可以被 fork 或自行托管。
此外,Meilisearch 使用 Rust 编写,这是一种现代系统级编程语言。Rust 提供了速度、可移植性和灵活性,这使得我们的搜索引擎可以无缝部署在虚拟机、容器甚至 Lambda@Edge 中。
定价
Algolia 的定价模式基于存储的记录数量和执行的 API 操作次数。对于中小型企业来说,其费用可能过高。
Meilisearch 是一个开源搜索引擎,可通过 Meilisearch Cloud 或自托管方式使用。与 Algolia 不同,Meilisearch 的定价基于存储的文档数量和执行的搜索操作次数。然而,Meilisearch 提供了更慷慨的免费层级,允许存储更多文档,并对搜索使用量提供更公平的定价。Meilisearch 还为大型用例提供了专业层级,以实现更可预测的定价。
搜索引擎生态概览
开源方案
Lucene
Apache Lucene 是一个免费开源的搜索库,用于索引和搜索全文文档。它由 Doug Cutting 于 1999 年创建,他此前曾在施乐帕洛阿尔托研究中心 (PARC) 和苹果公司开发过搜索引擎。Lucene 使用 Java 编写,旨在构建如 Google 和 DuckDuckGo 这样的网络搜索应用,后者至今仍在某些类型的搜索中使用 Lucene。
Lucene 后来被划分为多个项目:
- Lucene 核心:全文搜索库
- Solr:带有强大 REST API 的企业级搜索服务器
- Nutch:基于 Apache Hadoop 的可扩展网络爬虫
由于 Lucene 是许多开源或闭源搜索引擎背后的技术,它被视为参考级的搜索库标准。
Sonic
Sonic 是一个用 Rust 编写的轻量级无模式搜索索引服务器。它不能被视为开箱即用的解决方案,与 Meilisearch 相比,它不保证相关性排序。它不存储文档,而是包含一个带有 Levenshtein 自动机的倒排索引。这意味着任何查询 Sonic 的应用程序都必须使用返回的 ID 从外部数据库检索搜索结果,然后应用一些相关性排序。
它能够在几 MB 内存上运行的特性,使其成为数据库工具的一种极简且资源高效的替代方案,因为那些工具可能过于重量级而难以扩展。
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 数据库。文档存储在集合(collections)中,这些集合可以类比为关系型数据库中的表。
由于其可扩展的插件架构和可定制功能,Solr 是一个具有无限应用场景的搜索引擎。尽管它可以索引和搜索文档及电子邮件附件,但它在企业搜索领域尤其受欢迎。
Bleve 与 Tantivy
Bleve 和 Tantivy 分别是受 Apache Lucene 及其算法(例如 tf-idf,即词频-逆文档频率)启发,用 Golang 和 Rust 编写的搜索引擎项目。与 Lucene 类似,两者都是用于任何搜索项目的库;但它们不是开箱即用的 API。
源码可用
Elasticsearch
Elasticsearch 是一个基于 Lucene 库的搜索引擎,因其全文检索功能而广受欢迎。它提供了通过 HTTP 传输 JSON 的 REST API。其核心特性之一称为索引分片(index sharding),允许将索引划分为物理空间以提高性能并确保高可用性。Lucene 和 Elasticsearch 都专为处理高容量数据流、分析日志和执行复杂查询而设计。您可以对符合指定查询条件的文档执行操作和分析(例如计算所有名为”Thomas”用户的平均年龄)。
如今,Lucene 和 Elasticsearch 已成为搜索引擎领域的主导者。它们都是适用于多种搜索场景的可靠解决方案,也可用于构建推荐系统。作为通用型产品,它们需要经过适当配置才能获得与 Meilisearch 或 Algolia 相当的搜索结果。
闭源方案
Algolia
Algolia 是一家采用 SaaS 模式提供搜索引擎服务的公司,其软件为闭源产品。早期阶段,Algolia 专注于开发可嵌入移动应用的搜索引擎,面临从头实现搜索算法的挑战。从一开始,该公司就决定构建直接面向终端用户的搜索引擎,特别是为移动应用和网站实现站内搜索功能。过去几年间,Algolia 成功证明了容错输入(tolerating typos)对于提升用户体验的关键作用,以及其对降低跳出率、提高转化率的显著影响。
除 Algolia 外,搜索引擎市场上还有众多 SaaS 产品可供选择。其中大多数基于 Elasticsearch 进行深度定制,以提供个性化的解决方案。
Swiftype
Swiftype 是一家专注于网站搜索和分析的搜索服务提供商。该公司由 Matt Riley 和 Quin Hoxie 于 2012 年创立,现隶属于 Elastic(自 2017 年 11 月起)。作为基于 Elasticsearch 构建的端到端解决方案,Swiftype 能够充分利用 Elastic Stack 的技术优势。
Doofinder
Doofinder 是一项付费的站内搜索服务,其设计目标是只需极少配置即可集成到任何网站中。该服务被众多在线商店采用以提升销售额,旨在简化用户的购买流程。
结论
每种搜索解决方案都最适合特定用例的约束条件。由于每种类型的搜索引擎都提供独特的功能集,比较它们的性能既不容易也不相关。例如,在产品数据库上比较 Elasticsearch 和 Algolia 的速度是不公平的。对于非常大的全文数据库也是如此。
因此,我们无法与基于 Lucene 的搜索引擎或其他针对特定任务的搜索引擎进行比较。
在我们所涉及的特定用例中,与 Meilisearch 最相似的解决方案是 Algolia。
虽然 Algolia 提供了最先进和强大的搜索功能,但这种效率伴随着昂贵的价格。此外,他们的服务主要面向大型企业。
Meilisearch 致力于服务所有类型的开发者。我们的目标是提供一个对开发者友好、易于安装和部署的工具。因为为终端用户提供开箱即用的出色搜索体验对我们很重要,我们希望让每个人都能以最小的努力、无需任何财务资源就能获得最佳的搜索体验。
通常,当开发者寻找搜索工具集成到他们的应用程序时,他们会选择 ElasticSearch 或其他效果较差的选择。即使 Elasticsearch 并不最适合这种用例,它仍然是一个可用的优秀开源解决方案。然而,它需要技术知识来实现高级功能,因此需要更多时间来根据业务需求进行定制。
我们的目标是成为开发者的默认解决方案。