Sonic 配置参数详解

Sonic 配置文件逐段逐参数详解:全部 34 个配置键的真实默认值、取值与生效方式,附监听认证、检索上限、落盘合并等关键参数的实测验证与生产配置模板。

SonicSonic2026/10/17

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,实测)

二、前置条件

  1. Sonic 已安装并可启动(安装方式与 0→1 流程见《Sonic Docker Compose 部署指南》,或使用官方 APT 包/Releases 二进制/cargo 安装);
  2. 配置文件已就位且进程能读取。Sonic 按顺序查找默认路径,也支持显式指定,实测启动日志第一行即确认读取的配置文件:
2026-10-17T08:29:40.739206Z DEBUG reading config file: "/etc/sonic/config.cfg"
  1. 修改配置前备份原文件:
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 与源码默认值整理,标注默认值即不写该行时的行为):

段配置键类型默认值作用一句话
serverlog_levelstringwarn日志级别 debug/info/warn/error
channelinetstring[::1]:1491监听地址与端口
channeltcp_timeout整数(秒)300空闲/僵死连接超时
channelauth_passwordstring无(不认证)通道认证口令
normalizationunicode_normalizationstring无(不规范化)Unicode 规范化(nfc/nfkc)
normalizationdiacritic_folding_enabledboolfalse变音符号折叠
normalizationstemming_enabledboolfalse词干化
tokenizationdetect_special_patternsbooltrue识别邮箱/URL 等特殊模式
tokenizationcompat_split_special_patternsbooltrue特殊模式兼容性拆分
stopwordsallow数组[]永不停用的词
stopwordsdeny数组[]强制停用的词
searchquery_limit_default整数10QUERY 默认返回条数
searchquery_limit_maximum整数100QUERY 返回条数上限
searchquery_alternates_try整数4结果不足时尝试的相似词数
searchquery_minimum_term_idf_default浮点0.1查询词最低 IDF 阈值
searchquery_minimum_term_idf_minimum_object_count整数100IDF 阈值生效的最小对象数
searchsuggest_limit_default整数5SUGGEST 默认条数
searchsuggest_limit_maximum整数20SUGGEST 条数上限
searchlist_limit_default整数100LIST 默认条数
searchlist_limit_maximum整数500LIST 条数上限
store.kvpathstring./data/store/kv/KV 存储路径
store.kvretain_word_objects整数1000单词最多关联对象数(滑动窗口淘汰)
store.kvpool.inactive_after整数(秒)1800闲置数据库关闭时间
store.kvdatabase.flush_after整数(秒)900内存写入落盘周期
store.kvdatabase.compression_typestringzstd数据库压缩算法(none/zstd)
store.kvdatabase.parallelism整数2压缩/落盘并发线程上限
store.kvdatabase.max_files整数无(不限)单库最大打开文件数
store.kvdatabase.write_buffer_size整数(KiB)16384(16MiB)写缓冲上限
store.kvdatabase.write_ahead_logbooltrue预写日志(WAL)
store.fstpathstring./data/store/fst/FST 词图存储路径
store.fstpool.inactive_after整数(秒)300闲置词图关闭时间
store.fstgraph.consolidate_after整数(秒)180词图合并周期
store.fstgraph.max_size整数(KiB)2048(2MiB)图文件大小上限
store.fstgraph.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 归一为半角 A
NFKD兼容性分解同上且进一步拆分

官方推荐 "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。

八、参考链接