网站站内搜索分词库扩展,提升中文搜索准确度
网站站内搜索经常出现中文搜不准的情况,例如搜“服务器运维”匹配不到“服务器 运维”分开的内容,这通常是因为分词库没有覆盖业务专有词汇。
本文面向零基础站长,以 Elasticsearch 搭配 IK 分词器为例,讲清如何扩展自定义词典,让中文搜索准确度明显提升;
其他引擎如 Meilisearch、Sphinx 的思路类似,可参考调整。
先判断你的搜索为什么不准
在动手扩展词典前,先确认瓶颈确实在分词。
打开搜索接口或后台日志,观察用户搜索词被切成了哪些词条。
Elasticsearch 可以通过 _analyze 接口查看:
curl -X POST "http://localhost:9200/_analyze" -H 'Content-Type: application/json' -d'
{
"analyzer": "ik_max_word",
"text": "云服务器运维监控"
}'
如果“云服务器”被拆成“云”“服务器”,或者业务词“运维监控”被拆散,说明词典缺失。
这一步是后续所有操作的基础,只有确认分词结果不符合预期,扩展词典才有意义。
准备自定义词典文件
IK 分词器支持两种扩展方式:ext_dict 用于自定义词,ext_stopwords 用于停用词。
建议在 Elasticsearch 配置目录下新建 custom 文件夹统一管理。
cd /etc/elasticsearch/ik/config
mkdir custom
vim custom/my_dict.dic
词典文件要求每行一个词,UTF-8 编码,不要有空行。
例如:
云服务器
运维监控
站内搜索
分词库
保存后确认文件权限与 Elasticsearch 运行用户一致,通常为 elasticsearch:elasticsearch。
修改 IK 配置并重建索引
编辑 IKAnalyzer.cfg.xml,把自定义词典路径填进去:
custom/my_dict.dic
custom/my_stopword.dic
改完后需要重启 Elasticsearch 使词典加载:
systemctl restart elasticsearch
重启后旧索引不会自动应用新词典,必须重建索引。
以索引名 articles 为例,先创建新索引并指定相同 mapping,再用 _reindex 迁移数据:
curl -X POST "http://localhost:9200/_reindex" -H 'Content-Type: application/json' -d'
{
"source": { "index": "articles" },
"dest": { "index": "articles_new" }
}'
迁移完成后用别名切换,避免停机。
容易忽略的三个坑
第一,词典文件路径写错或权限不足,IK 不会报错,但自定义词根本不生效,重启后务必用 _analyze 复查。
第二,只改词典不重建索引,线上搜索仍然按旧分词执行,表现为“配置改了却没效果”。
第三,停用词不要过度添加,把“的”“了”之外的高频业务词加进去,可能导致搜索结果大幅减少。
验证中文搜索准确度
用之前不准的搜索词重新测试,例如搜“云服务器运维”应能命中包含该短语的文章。
同时观察返回结果的相关性排序,确认目标内容排在前列。
建议在业务低峰期操作,并保留旧索引一段时间,确认无误后再删除。
分词库扩展不是一次性的工作,业务出现新词时,把词加入 my_dict.dic、重启并重建索引即可。
如果站点使用宝塔面板,可在软件商店的 Elasticsearch 管理页找到配置目录,操作路径与上面一致。
常见疑问
问:必须重启 Elasticsearch 吗?
答:IK 分词器的自定义词典在启动时加载,修改后需要重启进程才能生效;部分版本支持热更新,但以实际版本行为为准。
问:重建索引会不会影响线上搜索?
答:采用新索引加别名切换的方式可以做到几乎无感,操作前先备份数据更稳妥。
问:Meilisearch 也能这样扩展吗?
答:Meilisearch 通过同义词和自定义分词规则实现类似效果,思路相通,具体配置项请以其官方文档为准。