Sonic 配置参数详解
Sonic 配置文件逐段逐参数详解:全部 34 个配置键的真实默认值、取值与生效方式,附监听认证、检索上限、落盘合并等关键参数的实测验证与生产配置模板。
Sonic 配置参数详解
> 目标:逐段逐参数讲清 Sonic 搜索后端配置文件(TOML 格式)的全部配置项——真实默认值、取值范围、改动影响与生效方式,并对监听地址、认证口令、检索上限、落盘与合并周期等关键参数给出实测验证;已在 Ubuntu 22.04 + sonic-server v1.10.2 实测通过。
一、环境信息
- 操作系统:Ubuntu 22.04(x86_64)
- 软件版本:sonic-server v1.10.2(启动日志与协议问候语双确认:
CONNECTED <sonic-server v1.10.2>) - 配置文件:
/opt/data/sonic/config.cfg(TOML 格式,本文全部示例基于该实测文件) - 数据目录:
/opt/data/sonic/store/(实测配置store.kv.path = "/opt/data/sonic/store/kv/"、store.fst.path = "/opt/data/sonic/store/fst/") - 监听端口:TCP 1491
- 认证口令:
q1w2e3r4(测试口令) - 空载内存:约 6–37 MiB(刚启动约 6.3 MiB,承载索引与查询一段时间后约 37 MiB,实测)
二、前置条件
- Sonic 已安装并可启动(安装方式与 0→1 流程见《Sonic Docker Compose 部署指南》,或使用官方 APT 包/Releases 二进制/cargo 安装);
- 配置文件已就位且进程能读取。Sonic 按顺序查找默认路径,也支持显式指定,实测启动日志第一行即确认读取的配置文件:
2026-10-17T08:29:40.739206Z DEBUG reading config file: "/etc/sonic/config.cfg"
- 修改配置前备份原文件:
cp /opt/data/sonic/config.cfg /opt/data/sonic/config.cfg.bak
(Sonic 无热加载,改错配置会导致进程启动失败,保留可回退的副本是最省事的保险。)
三、参数查看与修改方式
3.1 查看当前生效配置
Sonic 不提供「导出运行时配置」的命令,当前生效配置以「配置文件内容 + 启动日志确认」为准。查看方式:
grep -vE '^\s*(#|$)' /opt/data/sonic/config.cfg
实测输出(本环境实际生效的全部非注释配置行,输出节选):
[server]
log_level = "info"
[channel]
inet = "0.0.0.0:1491"
tcp_timeout = 300
auth_password = "q1w2e3r4"
[store.kv]
path = "/opt/data/sonic/store/kv/"
[store.fst]
path = "/opt/data/sonic/store/fst/"
3.2 修改与生效
Sonic 启动时读一次配置,无热加载。修改流程固定三步:编辑文件 → 重启进程 → 日志验证。以官方 deb 包部署为例,重启命令为 service sonic restart(官方文档口径);重启后确认两条日志出现:
2026-10-17T08:29:40.739206Z DEBUG reading config file: "/etc/sonic/config.cfg"
2026-10-17T08:29:40.740711Z INFO listening on tcp://0.0.0.0:1491
3.3 环境变量覆盖(优先级更高)
任何配置键都可用 SONIC_ 环境变量覆盖,路径分隔符为 __,且环境变量优先于配置文件。例如 channel.auth_password 对应 SONIC_CHANNEL__AUTH_PASSWORD:
SONIC_CHANNEL__AUTH_PASSWORD=q1w2e3r4 sonic -c /opt/data/sonic/config.cfg
此外 5 个键支持配置内插值:server.log_level、channel.inet、channel.auth_password、store.kv.path、store.fst.path,写法 auth_password = "${env.SONIC_PASSWORD}",启动时从环境变量展开。
💡 说明:口令类敏感值推荐「环境变量注入」而非写入配置文件;测试环境为降低排障复杂度直接落盘明文(本文用测试口令
q1w2e3r4)。
四、参数总览
Sonic 1.10.2 全部配置键、类型与真实默认值总表(依据官方 CONFIGURATION.md 与源码默认值整理,标注默认值即不写该行时的行为):
| 段 | 配置键 | 类型 | 默认值 | 作用一句话 |
|---|---|---|---|---|
| server | log_level | string | warn | 日志级别 debug/info/warn/error |
| channel | inet | string | [::1]:1491 | 监听地址与端口 |
| channel | tcp_timeout | 整数(秒) | 300 | 空闲/僵死连接超时 |
| channel | auth_password | string | 无(不认证) | 通道认证口令 |
| normalization | unicode_normalization | string | 无(不规范化) | Unicode 规范化(nfc/nfkc) |
| normalization | diacritic_folding_enabled | bool | false | 变音符号折叠 |
| normalization | stemming_enabled | bool | false | 词干化 |
| tokenization | detect_special_patterns | bool | true | 识别邮箱/URL 等特殊模式 |
| tokenization | compat_split_special_patterns | bool | true | 特殊模式兼容性拆分 |
| stopwords | allow | 数组 | [] | 永不停用的词 |
| stopwords | deny | 数组 | [] | 强制停用的词 |
| search | query_limit_default | 整数 | 10 | QUERY 默认返回条数 |
| search | query_limit_maximum | 整数 | 100 | QUERY 返回条数上限 |
| search | query_alternates_try | 整数 | 4 | 结果不足时尝试的相似词数 |
| search | query_minimum_term_idf_default | 浮点 | 0.1 | 查询词最低 IDF 阈值 |
| search | query_minimum_term_idf_minimum_object_count | 整数 | 100 | IDF 阈值生效的最小对象数 |
| search | suggest_limit_default | 整数 | 5 | SUGGEST 默认条数 |
| search | suggest_limit_maximum | 整数 | 20 | SUGGEST 条数上限 |
| search | list_limit_default | 整数 | 100 | LIST 默认条数 |
| search | list_limit_maximum | 整数 | 500 | LIST 条数上限 |
| store.kv | path | string | ./data/store/kv/ | KV 存储路径 |
| store.kv | retain_word_objects | 整数 | 1000 | 单词最多关联对象数(滑动窗口淘汰) |
| store.kv | pool.inactive_after | 整数(秒) | 1800 | 闲置数据库关闭时间 |
| store.kv | database.flush_after | 整数(秒) | 900 | 内存写入落盘周期 |
| store.kv | database.compression_type | string | zstd | 数据库压缩算法(none/zstd) |
| store.kv | database.parallelism | 整数 | 2 | 压缩/落盘并发线程上限 |
| store.kv | database.max_files | 整数 | 无(不限) | 单库最大打开文件数 |
| store.kv | database.write_buffer_size | 整数(KiB) | 16384(16MiB) | 写缓冲上限 |
| store.kv | database.write_ahead_log | bool | true | 预写日志(WAL) |
| store.fst | path | string | ./data/store/fst/ | FST 词图存储路径 |
| store.fst | pool.inactive_after | 整数(秒) | 300 | 闲置词图关闭时间 |
| store.fst | graph.consolidate_after | 整数(秒) | 180 | 词图合并周期 |
| store.fst | graph.max_size | 整数(KiB) | 2048(2MiB) | 图文件大小上限 |
| store.fst | graph.max_words | 整数 | 250000 | 图内词条数上限 |
解读:表中共 8 个段、34 个键。必须改的只有 channel.inet 与 channel.auth_password 两个(默认值不满足远程访问与安全要求);强烈建议评估的是 store.*.path(默认相对路径,随启动目录漂移,务必改绝对路径);其余默认值即官方推荐值。
五、核心参数分类详解
5.1 [server] 段:日志
log_level 控制进程日志详细程度,取值 debug/info/warn/error,默认 warn。官方建议生产用 error 以减少日志量;排障期临时调到 debug 可看到配置读取、语言检测等细节(本文实测期间用 info,能看到 tasker 周期与查询执行日志):
2026-10-17T08:29:40.740711Z INFO listening on tcp://0.0.0.0:1491
💡 技术拓展:日志级别的通用权衡——
级别 产出 适用 debug 全量内部细节(含每条命令分发) 排障临时开 info 启动、tasker 周期、查询执行 测试/观察运行状态 warn 仅异常与告警 默认 error 仅错误 生产长期运行 本环境实测采用
info,原因是需要观测 flush/consolidate 任务的真实触发;长期生产建议warn起步。
5.2 [channel] 段:监听与认证
inet(默认 [::1]:1491):监听的地址与端口,格式 "地址:端口"。默认值只绑 IPv6 回环,仅本机可连。需要被其他机器访问时改为 "0.0.0.0:1491"(IPv4 全网卡)。
实测生效验证——改配置重启后日志:
2026-10-17T08:29:40.740711Z INFO listening on tcp://0.0.0.0:1491
端口占用冲突时进程启动即失败,改 inet 末尾端口号即可(客户端同步改)。
tcp_timeout(默认 300):空闲连接与僵死连接的超时秒数。连接超时后服务端关闭 TCP。客户端长连接场景需在业务层做重连(官方客户端库内置);设置为 0 语义为永不超时,不建议(僵死连接会累积)。
auth_password(默认无):通道认证口令,START <mode> <password> 时校验。不设置时任何连接免认证,公网部署绝对禁止。实测错误口令被拒:
>>> START search wrong-pass
<<< ENDED authentication_failed
正确口令放行(实测):
>>> START search q1w2e3r4
<<< STARTED search protocol(1) buffer(20000)
5.3 [normalization] 段:文本规范化
该段在分词前对文本做统一化处理,任何改动都要求重建索引(重新 PUSH 全部数据),官方因此把新特性默认关闭(opt-in)。
unicode_normalization(默认不启用;可选 "nfc"/"nfkc"):Unicode 等价形式规范化。启用后查询更快、索引更小。
💡 技术拓展:Unicode 规范化形式对比——
形式 行为 典型效果 NFC 组合式合成(短) é存为单码位NFD 分解式拆分(长) é拆为e+ 组合重音符NFKC 兼容性合成 全角 A归一为半角ANFKD 兼容性分解 同上且进一步拆分 官方推荐
"nfkc"(对全角/半角混排最友好);当前默认不启用是为兼容旧索引,新建索引建议显式开启。本文实测环境保持默认none。
diacritic_folding_enabled(默认 false):变音符号折叠,开启后 déjà 归一为 deja,能减小索引并改善结果;法语等重变音语言建议开启。
stemming_enabled(默认 false):词干化(英文 running→run)。官方明确警告:开启会显著影响 Sonic 的结果质量,仅在确有理由时开启(它默认依赖 Snowball 词干器,按检测语言应用)。
5.4 [tokenization] 段:分词行为
detect_special_patterns(默认 true):识别邮箱、URL、电话号码、UUID 等特殊模式并保证其不被分词拆散、查询时精确匹配。官方评估开销可忽略,不建议关闭。
compat_split_special_patterns(默认 true):特殊模式的兼容拆分——索引时仍把 support@example.org 拆成 support 与 example.org 两个词条(兼容既有索引),查询时按整串精确匹配。实测本环境索引 Contact support@example.org for help 后,词表中出现的是拆分后的 support 与 example.org(LIST 实测节选):
backend contact example.org fast language lightweight programming rust schema search sonic support systems
若能重建索引且需要邮箱/号码精确检索,官方建议将此项改为 false(拆分消失、整串成为单一词条)。
中文分词说明:中文按 jieba 词级切分依赖 whatlang 语言检测(文本被判定为 cmn 时自动启用),过短文本可能检测失败而退化为逐字切分;PUSH/QUERY 显式携带 LANG(cmn) 可强制词级切分。实测对比与结论见《Sonic 介绍与选型指南》4.2 节,此处不重复。
5.5 [stopwords] 段:停用词定制
allow(默认 []):永不视为停用词的词。Sonic 内置 80+ 语言的本地化停用词表(英文 1296 个、中文 1098 个,实测自源码词表),例如英文表连 hello/world/help 都在列——如果业务必须索引这类词,把它们加入 allow:
[stopwords]
allow = ["hello", "world"]
deny(默认 []):强制不索引的词(如品牌词、脏词),加入后分词阶段直接丢弃。
⚠️ 注意:改停用词表同样要求重建索引才能保证存量数据与规则一致。
5.6 [search] 段:检索行为
query_limit_default = 10 / query_limit_maximum = 100:QUERY 未带 LIMIT 时返回默认 10 条;带 LIMIT(n) 时 n 不得小于 1 或大于 maximum,实测越界被拒:
>>> QUERY messages default "sonic" LIMIT(1000)
<<< ERR policy_reject(LIMIT out of minimum/maximum bounds)
query_alternates_try = 4:精确命中不足时,Sonic 从 FST 词图取相似词补足结果的最大尝试次数(0 关闭;过大有性能损耗)。这是「打错字也能搜到」能力的开关之一。
query_minimum_term_idf_default = 0.1 / query_minimum_term_idf_minimum_object_count = 100:IDF 过滤——桶内对象数达到 100 后,IDF 低于 0.1 的「大路词」(几乎出现在每个对象里的词)不再参与打分,避免低质量结果挤占尾部。注意桶内对象少于 100 时该过滤自动失效(源码实测确认的降级逻辑),小数据集不用调它。
suggest_limit_default = 5 / suggest_limit_maximum = 20、list_limit_default = 100 / list_limit_maximum = 500:SUGGEST 与 LIST 的默认/上限条数,越界同样返回 policy_reject,实测(SUGGEST 带 LIMIT(500)):
>>> SUGGEST messages default "sea" LIMIT(500)
<<< ERR policy_reject(LIMIT out of minimum/maximum bounds)
5.7 [store.kv] 段:KV 存储引擎(RocksDB)
path(默认 ./data/store/kv/):KV 库落盘路径。默认相对路径随进程启动目录漂移,务必改为绝对路径。实测配置与本机数据落点:
ls /opt/data/sonic/store/kv/
4244275
4f744a98
6dbe5b68
d0b342
(子目录为按集合散列的库文件。)
retain_word_objects = 1000:每个词最多关联的对象数,超出的旧对象按滑动窗口淘汰。这是索引膨胀的总闸:1000 表示一个热词最多记 1000 个对象。业务对象被反复召回的期望低时维持默认;需要完整召回(如法律文书检索)时调大并接受内存/磁盘增长。
pool.inactive_after = 1800:闲置 1800 秒后关闭该集合的数据库句柄(节流)。多集合大部署下调小可省句柄,单集合部署无感。
database.flush_after = 900:内存写入落盘周期(秒)。必须严格小于 pool.inactive_after,否则启动 panic。配合 write_ahead_log = true,宕机时 WAL 兜底,未落盘写入也不丢;调小更安全但增加 IO,调大更省 IO 但拉长纯内存暴露窗口。
database.write_ahead_log = true:预写日志开关。实测持久化验证:写入数据 → 重启进程 → 查询结果与计数完全一致(COUNTB 重启前后均 RESULT 5,QUERY 结果集不变),生产必须保持开启。
database.compression_type = "zstd":SST 文件压缩算法,可选 none/zstd。zstd 换 CPU 省磁盘,磁盘紧张保持默认即可。
database.parallelism = 2:压缩与落盘后台线程数上限。CPU 富余且写入量大时可调大(如 4),缓解 flush 任务争抢。
database.max_files:单库最大同时打开文件数,默认不限制;文件句柄紧张的系统(小 ulimit -n)建议显式设为 100 左右防 Too many open files。
database.write_buffer_size = 16384:写缓冲大小,单位 KiB(16384 = 16MiB),写满即触发落盘。写入密集场景可提到 65536(64MiB)减少落盘次数,代价是内存占用上升。
💡 技术拓展:RocksDB 还有二十余个进阶键(
wal_recovery_mode、level_zero_*_writes_trigger、max_background_jobs、block_cache_size等,默认沿用 RocksDB 出厂值)——
诉求 关注键 默认 崩溃恢复策略 database.wal_recovery_modepoint_in_time写放大/停滞 level_zero_slowdown_writes_trigger/stop_writes_trigger20 / 24 后台任务 max_background_jobs2 读缓存 block_cache_sizeRocksDB 默认 通用调优原则:默认值已覆盖绝大多数场景,只有观测到具体瓶颈(写停滞日志、flush 高 CPU)时才动对应键。
5.8 [store.fst] 段:FST 词图引擎
path(默认 ./data/store/fst/):词图文件路径,同 KV 一样务必用绝对路径。实测:
ls /opt/data/sonic/store/fst/
4f744a98
6dbe5b68
pool.inactive_after = 300:闲置词图关闭时间(秒),需严格大于 graph.consolidate_after。
graph.consolidate_after = 180:词图合并周期(秒)。PUSH 的词先进内存缓冲,合并后进入磁盘图文件,SUGGEST/LIST 才可见。实测合并前 LIST/SUGGEST 返回空、TRIGGER consolidate 后立即出现的完整过程见《Sonic 介绍与选型指南》3.3 节。对补全实时性要求高的业务把该值调小(如 30),代价是合并更频繁。
graph.max_size = 2048:图文件大小上限(KiB,即 2MiB),超限后新词不再插入图(SUGGEST 覆盖不到新词)。
graph.max_words = 250000:图内词条数上限,与 max_size 任一触顶即停。词条量预计超 25 万(如全站商品词)时必须上调,并同步评估 max_size。
六、生产配置模板
适用场景:8–16GB 内存、SSD 磁盘、单机承载百万级对象以内的应用内搜索/聊天记录检索(Sonic 典型目标场景),远程可访问 + 口令认证:
[server]
log_level = "warn"
[channel]
inet = "0.0.0.0:1491"
tcp_timeout = 300
auth_password = "替换为强随机口令"
[normalization]
unicode_normalization = "nfkc"
diacritic_folding_enabled = true
stemming_enabled = false
[tokenization]
detect_special_patterns = true
compat_split_special_patterns = false
[stopwords]
allow = []
deny = []
[search]
query_limit_default = 10
query_limit_maximum = 100
query_alternates_try = 4
query_minimum_term_idf_default = 0.1
query_minimum_term_idf_minimum_object_count = 100
suggest_limit_default = 5
suggest_limit_maximum = 20
list_limit_default = 100
list_limit_maximum = 500
[store.kv]
path = "/opt/data/sonic/store/kv/"
retain_word_objects = 1000
pool.inactive_after = 1800
database.flush_after = 900
database.compression_type = "zstd"
database.parallelism = 2
database.write_buffer_size = 16384
database.write_ahead_log = true
[store.fst]
path = "/opt/data/sonic/store/fst/"
pool.inactive_after = 300
graph.consolidate_after = 180
graph.max_size = 20480
graph.max_words = 2000000
与默认值的差异及理由:
inet/auth_password:远程访问与安全刚需(唯一必须改项);unicode_normalization = "nfkc"、diacritic_folding_enabled = true:新建索引建议开启,查询更快、索引更小、全半角混排一致(⚠️ 旧索引需重建后才能改);compat_split_special_patterns = false:新索引无需兼容旧拆分,邮箱/号码整串成词精确检索(⚠️ 同样要求新索引);graph.max_size/max_words:上调至 20MiB/200 万词,避免中型业务词图提前触顶。
低内存机器(2GB)版本:将 database.write_buffer_size 降至 4096(4MiB)、database.parallelism 降至 1、graph.max_size 维持 2048,其余不变。
七、常见问题
Q1:改了配置重启后没生效?
先确认改的是进程实际读取的文件(启动日志第一行 reading config file: "...");再确认没有同键环境变量覆盖(SONIC_ 前缀变量优先级更高);最后确认重启的是正确进程。
Q2:启动即 panic 退出?
两类硬校验:store.kv.database.flush_after 必须严格小于 store.kv.pool.inactive_after;store.fst.graph.consolidate_after 必须严格小于 store.fst.pool.inactive_after。另检查 database.write_buffer_size 不得为 0。按默认关系(900<1800、180<300)调整即可。
Q3:配置写错格式怎么办?
配置为 TOML:段头 [section]、键值 key = value、字符串加双引号、子键用点号(pool.inactive_after)。格式错误时进程启动失败并以日志指明出错位置,恢复 .bak 副本最快捷。
Q4:远程机器连不上但本机 telnet 正常?
检查 inet 是否仍为默认 [::1]:1491(仅回环);改 0.0.0.0:1491 重启后日志出现 listening on tcp://0.0.0.0:1491 即解决。防火墙放行 1491/tcp 同步确认。
Q5:STOP/热加载命令存在吗?
不存在。Sonic 无热加载、无在线重载命令,配置生效必须重启进程;重启期间客户端按 tcp_timeout 感知断连并重连,索引数据由 WAL 与落盘保证不丢(实测验证)。
Q6:改了 normalization/tokenization/stopwords 后检索结果混乱? 这三段的行为变更只对「改动之后写入的数据」生效,存量索引仍是旧规则产物。官方要求:改动后重建索引(FLUSHC 全量集合后重新 PUSH),或新旧数据隔离到不同 collection。
八、参考链接
- 官方配置参考(CONFIGURATION.md,本文默认值依据):https://github.com/valeriansaliou/sonic/blob/master/CONFIGURATION.md
- 源码配置结构(core/src/config.rs):https://github.com/valeriansaliou/sonic/blob/master/core/src/config.rs
- 官方仓库:https://github.com/valeriansaliou/sonic
- 官方协议规范:https://github.com/valeriansaliou/sonic/blob/master/PROTOCOL.md
- 本专栏配套篇:《Sonic 介绍与选型指南》《Sonic Docker Compose 部署指南》《Sonic 常用 CLI 命令与工具详解》
- 相关文档:《MeiliSearch 1.55.0 配置参数详解》《Sonic Docker Compose 部署指南》