Sonic:用 Rust 写的轻量搜索后端,30MB 内存跑起来

正文顶部截图

做搜索功能,很多人第一反应是 Elasticsearch。功能确实全,但资源消耗也大,小项目根本跑不动。今天介绍一个替代方案,叫 Sonic,用 Rust 写的,2.1 万 Star,主打一个轻和快。

Sonic 的定位很明确:它不是 Elasticsearch 的完全替代品,而是一个轻量级的搜索索引。它只做一件事,就是把文本拆词建索引,然后返回匹配的对象 ID。具体的数据存在哪、怎么展示,那是你自己的事。

为什么不用 Elasticsearch

Elasticsearch 的问题在于太重了。跑起来动辄几百兆内存,还得配 Java 环境,小团队根本伺候不起。而 Sonic 的实测数据是,负载下响应时间在微秒级别,内存占用约 30MB,CPU 占用极低。

Crisp(Sonic 的母公司)拿它来索引 5 亿条数据,跑在一台 5 美元一个月的单核云服务器上。这个成本控制能力,Elasticsearch 做不到。

它能干什么

Sonic 的核心能力有三个:

搜索:输入一段文字,返回匹配的对象 ID。支持模糊匹配和拼写纠错,用户打错字也能找到结果。

自动补全:输入至少 2 个字符,就能实时返回补全建议。适合做搜索框的下拉提示。

数据管理:支持往索引里添加和删除数据,后台会自动合并整理,不会影响搜索性能。

它的定位是标识符索引。搜出来的结果是 ID,你需要自己去数据库里查完整数据。这个设计让 Sonic 保持了轻量,也给了开发者更多灵活性。

支持的语言

Sonic 内置了 80 多种语言的分词器,包括中文(简繁)、日文、韩文、英文、法文、德文等等。它会自动识别文本语言,去掉停用词(比如英文里的 “the”、“a”),然后再建索引。

这意味着你不需要额外配置语言相关的参数,丢进去的文字它自己处理。

README区域截图

性能实测

官方做了一个基准测试,在 2014 年的 MacBook Pro 上跑:

  • 导入 100 万条消息,索引体积 20MB(KV)+ 1.4MB(FST)
  • 单线程导入速度接近每秒 4000 次操作
  • 单线程查询速度接近每秒 1000 次操作
  • 单次查询耗时约 880 微秒
  • 内存峰值 28MB

如果有 8 个虚拟核心,理论上导入速度能到每秒 32000 次,查询能到每秒 8000 次。对大多数场景来说,这个性能绰绰有余。

怎么用

Sonic 提供了多种安装方式:Debian 包、源码编译、cargo install、Docker Hub 镜像都有。装好之后编辑配置文件,启动就行。

交互方式走的是 Sonic Channel 协议,基于 TCP,没有 HTTP 接口。这个设计和 Redis 类似,追求的是低开销和高效率。

官方提供了 Node.js、PHP、Rust 的客户端库,社区还维护了 Python、Go、Java、Ruby、Elixir、Crystal 等十几个语言的实现。基本上主流语言都能找到现成的库。

适合什么场景

Sonic 适合这些情况:

  • 需要全文搜索,但不想部署 Elasticsearch
  • 数据量中等(百万到亿级),对延迟有要求
  • 预算有限,服务器配置不高
  • 只需要搜索结果的 ID,不需要直接返回完整文档

不适合的场景:需要复杂聚合查询、需要返回高亮片段、需要处理超大规模数据(十亿级以上)。这些还是得上 Elasticsearch 或类似的重量级方案。

和 Redis 搜索模块的区别

有人可能会问,Redis 不是也有搜索功能吗?确实,Redis 的 RediSearch 模块也能做全文搜索。但 RediSearch 是 Redis 的扩展,得先跑 Redis;而 Sonic 是独立服务,不需要依赖其他组件。如果你的项目已经在用 Redis,那 RediSearch 可能更方便;如果你需要一个纯粹的搜索服务,Sonic 更合适。

安装门槛

用 Docker 的话,一条命令就能跑起来。从源码编译需要装 Rust 工具链和一些系统依赖(build-essential、clang、libclang-dev 等)。macOS 用户可以直接 brew install sonic。

整体来说,安装过程不复杂,比 Elasticsearch 简单多了。

写在最后

Sonic 解决的是一个特定的问题:在资源有限的情况下提供快速的全文搜索。对于个人项目、小团队产品、或者需要在低成本服务器上跑搜索的场景,Sonic 是一个值得考虑的选择。

项目是 MIT 协议,代码完全开源,可以自由修改和部署。

于个人项目、小团队产品、或者需要在低成本服务器上跑搜索的场景,Sonic 是一个值得考虑的选择。

项目是 MIT 协议,代码完全开源,可以自由修改和部署。

更多推荐