Sonic:用 Rust 写的轻量搜索后端,30MB 内存跑起来
文章目录Sonic用 Rust 写的轻量搜索后端30MB 内存跑起来为什么不用 Elasticsearch它能干什么支持的语言性能实测怎么用适合什么场景和 Redis 搜索模块的区别安装门槛写在最后Sonic用 Rust 写的轻量搜索后端30MB 内存跑起来做搜索功能很多人第一反应是 Elasticsearch。功能确实全但资源消耗也大小项目根本跑不动。今天介绍一个替代方案叫 Sonic用 Rust 写的2.1 万 Star主打一个轻和快。Sonic 的定位很明确它不是 Elasticsearch 的完全替代品而是一个轻量级的搜索索引。它只做一件事就是把文本拆词建索引然后返回匹配的对象 ID。具体的数据存在哪、怎么展示那是你自己的事。为什么不用 ElasticsearchElasticsearch 的问题在于太重了。跑起来动辄几百兆内存还得配 Java 环境小团队根本伺候不起。而 Sonic 的实测数据是负载下响应时间在微秒级别内存占用约 30MBCPU 占用极低。CrispSonic 的母公司拿它来索引 5 亿条数据跑在一台 5 美元一个月的单核云服务器上。这个成本控制能力Elasticsearch 做不到。它能干什么Sonic 的核心能力有三个搜索输入一段文字返回匹配的对象 ID。支持模糊匹配和拼写纠错用户打错字也能找到结果。自动补全输入至少 2 个字符就能实时返回补全建议。适合做搜索框的下拉提示。数据管理支持往索引里添加和删除数据后台会自动合并整理不会影响搜索性能。它的定位是标识符索引。搜出来的结果是 ID你需要自己去数据库里查完整数据。这个设计让 Sonic 保持了轻量也给了开发者更多灵活性。支持的语言Sonic 内置了 80 多种语言的分词器包括中文简繁、日文、韩文、英文、法文、德文等等。它会自动识别文本语言去掉停用词比如英文里的 “the”、“a”然后再建索引。这意味着你不需要额外配置语言相关的参数丢进去的文字它自己处理。性能实测官方做了一个基准测试在 2014 年的 MacBook Pro 上跑导入 100 万条消息索引体积 20MBKV 1.4MBFST单线程导入速度接近每秒 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 协议代码完全开源可以自由修改和部署。