Project Icon

sonic

快速轻量的开源搜索后端

Sonic是一个开源的搜索后端,具有快速、轻量和无模式等特点。它可以在微秒级时间内处理搜索请求,支持自然语言查询处理和搜索建议功能。相比Elasticsearch等全功能搜索引擎,Sonic提供了一种简单高效的替代方案。该项目重视性能优化和代码质量,致力于提供稳定、快速且资源占用少的搜索服务。

Sonic

测试和构建 构建和发布 依赖状态 请我喝咖啡

Sonic是一个快速、轻量级且无模式的搜索后端。它能够摄取搜索文本和标识符元组,然后在微秒级时间内对其进行查询。

在某些使用场景下,Sonic可以作为超重且功能齐全的搜索后端(如Elasticsearch)的简单替代品。它能够规范化自然语言搜索查询,自动完成搜索查询,并提供最相关的查询结果。Sonic是一个标识符索引,而非文档索引;当被查询时,它返回的是ID,这些ID可以用于在外部数据库中引用匹配的文档。

在设计Sonic时,我们特别注重性能和代码整洁度。它旨在做到无崩溃、超快速,并对服务器资源施加最小压力(我们的测量显示,Sonic在负载下对搜索查询的响应时间在微秒级范围内,占用约30MB内存,CPU占用率低;查看我们的基准测试)。

在Rust版本:rustc 1.74.1 (a28077b28 2023-12-04)上测试

🇫🇷 在法国南特精心打造。

:newspaper: Sonic项目最初在我的个人博客文章中宣布。

Sonic

"Sonic"是Sonic项目的吉祥物。我将它画成一只迷幻的嬉皮士刺猬。

谁在使用?

CrispScrumpy

👋 你使用Sonic并想在这里列出吗?联系我

演示

Sonic已集成到Crisp平台上的所有Crisp搜索产品中。截至2019年,它在一台每月5美元的1-vCPU SSD云服务器上用于索引5亿个对象。Crisp用户使用它来搜索他们的消息、对话、联系人、帮助中心文章等。

你可以在Crisp帮助中心上实时测试Sonic,并了解Sonic搜索结果的速度和相关性。你还可以从那里测试搜索建议:为一个词至少输入2个字符,就会得到一个完整词的建议(按tab键展开建议)。搜索和建议都由Sonic提供支持。

Crisp帮助中心搜索演示

Sonic在帮助中心文章中的模糊搜索表现出色。查找任何单词或短语组合,立即获得结果。

特性

  • 搜索词存储在集合中,按桶组织;你可以使用单个桶,或者如果需要在不同的索引中搜索,可以为平台上的每个用户使用一个桶。
  • 搜索结果返回对象标识符,如果需要丰富搜索结果,可以从外部数据库解析这些标识符。这使得Sonic成为一个简单的词索引,指向标识符结果。Sonic在其索引中不存储任何直接的文本数据,但它仍然保留一个词图用于自动完成和错误纠正。
  • 搜索查询中的拼写错误会被纠正,如果搜索查询中的某个词没有足够的精确匹配结果,Sonic会尝试纠正该词并尝试替代词。你在搜索时可以犯错误。
  • 在索引中插入和删除项目;改变索引的操作很轻量,可以在服务器运行时提交。后台任务处理程序负责整合索引,使你推送或弹出的条目能够快速用于搜索。
  • 实时自动完成任何单词,通过建议操作。这有助于在你的最终用户搜索界面中构建快速的单词建议功能。
  • 完全兼容Unicode,支持全球80多种使用最广泛的语言。Sonic在猜测文本语言后,会从任何文本中删除无用的停用词(例如英语中的"the")。这确保了任何被搜索或摄入的文本在进入索引之前都是干净的;查看支持的语言
  • 简单的协议(Sonic Channel),允许你搜索索引、管理数据摄入(推入索引、从索引中弹出、刷新集合、刷新桶等)并执行管理操作。Sonic Channel被设计为资源占用少且易于集成;阅读协议规范
  • 易于使用的库,让你可以从应用程序连接到Sonic;查看库

如何使用?

安装

Sonic是用Rust构建的。要安装它,你可以从Sonic发布页面下载版本,使用cargo install或从master分支拉取源代码。

👉 每个发布的二进制文件都附带一个.asc签名文件,可以使用@valeriansaliou的GPG公钥进行验证::key:valeriansaliou.gpg.pub.asc

👉 从包安装:

Sonic为基于Debian的系统(Debian、Ubuntu等)提供预构建包

重要提示:Sonic目前仅提供针对Debian 12(代号:bookworm)的64位包。你可能仍然能够在其他Debian版本以及Ubuntu上使用它们,尽管它们依赖于特定版本的glibc,这可能在较旧或较新的系统上不可用。

首先,添加Sonic APT仓库(例如,对于Debian bookworm):

echo "deb [signed-by=/usr/share/keyrings/valeriansaliou_sonic.gpg] https://packagecloud.io/valeriansaliou/sonic/debian/ bookworm main" > /etc/apt/sources.list.d/valeriansaliou_sonic.list
curl -fsSL https://packagecloud.io/valeriansaliou/sonic/gpgkey | gpg --dearmor -o /usr/share/keyrings/valeriansaliou_sonic.gpg
apt-get update

然后,安装Sonic包:

apt-get install sonic

接着,编辑预填充的Sonic配置文件:

nano /etc/sonic.cfg

最后,重启Sonic:

service sonic restart

👉 从源代码安装:

如果你从Git拉取了源代码,可以使用cargo构建:

cargo build --release

你可以在./target/release目录中找到构建好的二进制文件。

安装build-essentialclanglibclang-devlibc6-devg++llvm-dev以便能够编译所需的RocksDB依赖。

注意,在构建Sonic时可以启用以下可选功能:allocator-jemalloctokenizer-chinesetokenizer-japanese(某些功能可能默认已启用)。

👉 从Cargo安装:

你可以直接使用cargo install安装Sonic:

cargo install sonic-server

确保你的$PATH正确配置以源自Crates二进制文件,然后使用sonic命令运行Sonic。

安装build-essentialclanglibclang-devlibc6-devg++llvm-dev以便能够编译所需的RocksDB依赖。

👉 从Docker Hub安装:

通过Docker运行Sonic可能会很方便。你可以在Docker Hub上找到预构建的Sonic镜像,名为valeriansaliou/sonic。 首先,拉取 valeriansaliou/sonic 镜像:

docker pull valeriansaliou/sonic:v1.4.9

然后,为其提供配置文件并运行(将 /path/to/your/sonic/config.cfg 替换为你的配置文件路径):

docker run -p 1491:1491 -v /path/to/your/sonic/config.cfg:/etc/sonic.cfg -v /path/to/your/sonic/store/:/var/lib/sonic/store/ valeriansaliou/sonic:v1.4.9

在配置文件中,确保:

  • channel.inet 设置为 0.0.0.0:1491(这允许从容器外部访问 Sonic)
  • store.kv.path 设置为 /var/lib/sonic/store/kv/(这允许 Sonic 访问外部 KV 存储目录)
  • store.fst.path 设置为 /var/lib/sonic/store/fst/(这允许 Sonic 访问外部 FST 存储目录)

Sonic 将可通过 tcp://localhost:1491 访问。

👉 从其他来源安装(非官方):

其他安装来源包括:

注意,这些来源是非官方的,意味着它们不由 Sonic 项目所有者拥有或维护。与 Sonic 项目提供的最新版本相比,这些来源提供的 Sonic 版本可能过时。

配置

使用示例 config.cfg 配置文件,并根据你的环境进行调整。

如果你想微调配置,可以阅读我们的详细配置文档

运行 Sonic

Sonic 可以这样运行:

./sonic -c /path/to/config.cfg

执行搜索和管理对象

搜索和对象管理(即数据摄入)仅通过 Sonic Channel 协议处理。为了保持 Sonic 的简单性(类似于 Redis),Sonic 不提供 HTTP 端点或类似功能;当你需要与 Sonic 搜索数据库交互时,通过 Sonic Channel 连接是唯一的方式。

Sonic 提供官方库,让你能轻松将 Sonic 集成到你的应用中。点击下面的库以查看库集成文档和代码。

如果你想了解原始 Sonic Channel 基于 TCP 的协议详情,可以阅读我们的详细协议文档。如果你想编写自己的 Sonic Channel 库,这可能会很有用。

📦 Sonic Channel 库

1️⃣ 官方库

Sonic 为你的编程语言提供官方 Sonic 集成库(官方意味着这些库已经由核心维护者审查和验证):

2️⃣ 社区库

以下是社区提供的 Sonic 集成列表(非常感谢他们的贡献!):

ℹ️ 找不到适合你编程语言的库?构建你自己的库并在此处被引用!(联系我

支持哪些文本语言?

Sonic 在其词法系统中支持广泛的语言。如果某种语言不在此列表中,你仍然可以将该语言推送到搜索索引,但停用词不会被排除,这可能导致搜索结果质量降低。

词法系统支持的语言有:

  • 🇿🇦 南非荷兰语
  • 🇸🇦 阿拉伯语
  • 🇦🇲 亚美尼亚语
  • 🇦🇿 阿塞拜疆语
  • 🇧🇩 孟加拉语
  • 🇧🇬 保加利亚语
  • 🇲🇲 缅甸语
  • 🏳 加泰罗尼亚语
  • 🇨🇳 中文(简体)
  • 🇹🇼 中文(繁体)
  • 🇭🇷 克罗地亚语
  • 🇨🇿 捷克语
  • 🇩🇰 丹麦语
  • 🇳🇱 荷兰语
  • 🇬🇧 英语
  • 🏳 世界语
  • 🇪🇪 爱沙尼亚语
  • 🇫🇮 芬兰语
  • 🇫🇷 法语
  • 🇬🇪 格鲁吉亚语
  • 🇩🇪 德语
  • 🇬🇷 希腊语
  • 🇮🇳 古吉拉特语
  • 🇮🇱 希伯来语
  • 🇮🇳 印地语
  • 🇭🇺 匈牙利语
  • 🇮🇩 印度尼西亚语
  • 🇮🇹 意大利语
  • 🇯🇵 日语
  • 🇮🇳 卡纳达语
  • 🇰🇭 高棉语
  • 🇰🇷 韩语
  • 🏳 拉丁语
  • 🇱🇻 拉脱维亚语
  • 🇱🇹 立陶宛语
  • 🇮🇳 马拉雅拉姆语
  • 🇮🇳 马拉地语
  • 🇳🇵 尼泊尔语
  • 🇮🇷 波斯语
  • 🇵🇱 波兰语
  • 🇵🇹 葡萄牙语
  • 🇮🇳 旁遮普语
  • 🇷🇺 俄语
  • 🇷🇸 塞尔维亚语
  • 🇸🇰 斯洛伐克语
  • 🇸🇮 斯洛文尼亚语
  • 🇪🇸 西班牙语
  • 🇸🇪 瑞典语
  • 🇵🇭 他加禄语
  • 🇮🇳 泰米尔语
  • 🇹🇭 泰语
  • 🇹🇷 土耳其语
  • 🇺🇦 乌克兰语
  • 🇵🇰 乌尔都语
  • 🇻🇳 越南语
  • 🇮🇱 意第绪语
  • 🇿🇦 祖鲁语

它的速度和轻量级程度如何?

Sonic 从一开始就是为 Crisp 而构建的。随着 Crisp 的增长和将越来越多的搜索数据索引到全文搜索 SQL 数据库中,我们决定是时候切换到一个合适的搜索后端系统了。在审查 Elasticsearch(ELS)和其他系统时,我们发现这些都是功能齐全的重量级系统,无法很好地适应 Crisp 基于免费增值的成本结构。

最终,我们决定构建自己的搜索后端,设计成简单且对资源要求轻量的系统。

您可以使用以下命令运行函数级基准测试:cargo bench --features benchmark

👩‍🔬 基准测试 #1

➡️ 场景

我们提取了 Crisp 自身客户支持团队使用的所有消息。

我们想将所有这些消息导入到一个全新的 Sonic 实例中,然后对我们建立的索引执行搜索。我们将测量 Sonic 执行每个操作所花费的时间(即通过 Sonic Channel 执行的每个 PUSHQUERY 命令),并将结果按每 1,000 次操作分组(这会输出每 1,000 次操作的平均时间)。

➡️ 环境

我们的基准测试在以下计算机上运行:

  • 设备:MacBook Pro(视网膜显示屏,15 英寸,2014 年中)
  • 操作系统:MacOS 10.14.3
  • 磁盘:512GB SSD(以 AFS 文件系统格式化)
  • CPU:2.5 GHz Intel Core i7
  • 内存:16 GB 1600 MHz DDR3

Sonic 的编译方式如下:

  • Sonic 版本:1.0.1
  • Rustc 版本rustc 1.35.0-nightly (719b0d984 2019-03-13)
  • 编译器标志release 配置(-03lto

我们的数据集如下:

  • 对象数量:约 1,000,000 条消息
  • 总大小:约 100MB 的原始消息文本(这不包括标识符和其他元数据)

➡️ 脚本

我们用于执行基准测试的脚本是:

  1. PUSH 脚本sonic-benchmark_batch-push.js
  2. QUERY 脚本sonic-benchmark_batch-query.js

⏬ 结果

我们的发现:

  • 我们导入了约100万条长度不一的消息(有些非常长,如电子邮件);
  • 导入后,搜索索引在磁盘上占用20MB(KV) + 1.4MB(FST);
  • 导入过程中CPU使用率平均为单核75%;
  • 在我们的基准测试中,Sonic进程的内存使用峰值为28MB;
  • 我们使用了单个Sonic Channel TCP连接,这将导入限制在单线程(我们本可以将其负载均衡到与CPU数量相同的多个Sonic Channel连接);
  • 我们获得的导入RPS接近每秒4,000次操作(每线程);
  • 我们获得的搜索查询RPS接近每秒1,000次操作(每线程);
  • 在使用的4核超线程CPU上,我们本可以将操作并行化到8个虚拟核心,从而理论上将导入RPS提高到每秒32,000次操作,而搜索查询RPS将提高到每秒8,000次操作(不过在某个时点可能会受到SSD的限制);

每次操作的比较结果(针对单个对象):

我们从批处理操作中抽取了8个结果样本,这些样本产生了总共1,000个结果(100万项,每1,000项批量进行一次测量报告)。

这并不是很科学,但应该能让你清楚了解Sonic的性能。

每次操作所花费的时间:

操作平均最佳最差
PUSH275μs190μs363μs
QUERY880μs852μs1ms

从终端看到的批量PUSH结果(从初始索引:0个对象):

[批量PUSH基准测试图片]

从终端看到的批量QUERY结果(在索引:1,000,000个对象上):

[批量QUERY基准测试图片]

限制

  • 索引数据限制: Sonic设计用于在每个集合中分割成数千个搜索桶的大型搜索索引。IID(即内部ID)在索引中存储为32位数字,理论上每个桶可以索引多达约42亿个对象(即OID)。我们观察到30%到40%的存储节省,这证明了在大型数据库上的权衡是合理的(相比Sonic使用64位IID)。此外,Sonic仅以滑动窗口方式保留给定词的N个最近推送的结果(滑动窗口宽度可配置)。

  • 搜索查询限制: 出于存储紧凑性考虑,Sonic的自然语言处理系统(NLP)不在句子级别工作(我们保持FST图的浅层以减少时间和空间复杂度)。它在词级别工作,因此能够进行按词搜索并基于用户输入预测词,但无法预测句子中的下一个词。

  • 实时限制: 每次向桶图推送或弹出词时都需要重建FST。由于这相当耗费资源,Sonic会批量进行重建周期。如果你刚刚向索引推送了一个新词,但在SUGGEST命令中还看不到它,请等待下一个重建周期启动,或在control通道中使用TRIGGER consolidate强制执行。

  • 互操作性限制: Sonic Channel协议是读写Sonic搜索索引中搜索条目的唯一方式。Sonic不提供任何HTTP API。Sonic Channel的设计考虑了性能和最小网络占用。如果你需要从不受支持的编程语言访问Sonic,你可以提出问题或参考node-sonic-channel实现,并在你的目标编程语言中构建它。

  • 硬件限制: Sonic直接在文件系统上执行搜索;即它不将索引放入RAM。搜索查询会导致大量随机访问磁盘,这意味着在老式HDD上会相当慢,而在较新的SSD上会超快。请仅将Sonic数据库存储在SSD支持的文件系统上。

:fire: 报告漏洞

如果你在Sonic中发现漏洞,非常欢迎你直接向@valeriansaliou报告,方法是发送加密电子邮件至valerian@valeriansaliou.name。请勿在公开的GitHub问题中报告漏洞,因为恶意人员可能会利用它们来攻击运行未修补Sonic实例的生产服务器。

:warning: 你必须使用@valeriansaliou的GPG公钥加密你的电子邮件: :key:valeriansaliou.gpg.pub.asc

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

稿定AI

稿定设计 是一个多功能的在线设计和创意平台,提供广泛的设计工具和资源,以满足不同用户的需求。从专业的图形设计师到普通用户,无论是进行图片处理、智能抠图、H5页面制作还是视频剪辑,稿定设计都能提供简单、高效的解决方案。该平台以其用户友好的界面和强大的功能集合,帮助用户轻松实现创意设计。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号