网站站内搜索分词优化,中文搜索适配
很多用户反馈站内搜索明明有关键词却搜不到内容,或者搜出来的结果完全不相关。
这通常是中文分词没有配置好导致的。
下面从实际场景出发,把网站站内搜索分词优化和中文搜索适配的完整流程拆成可照做的步骤,帮你在自己的服务器上解决这个问题。
先确认你遇到的是不是分词问题
搜索“服务器运维”时,如果返回结果里只有包含完整四个字的文章,而“服务器”或“运维”单独出现的文章却不显示,基本可以判断是分词粒度太粗。
中文和英文不同,英文靠空格自然分词,中文需要专门的分词组件把句子切成有意义的词。
常见的站内搜索方案有两类:一类是 MySQL 的 LIKE 模糊查询,另一类是 Elasticsearch 或 MeiliSearch 等全文搜索引擎。
LIKE 查询在数据量小的时候勉强能用,但无法处理分词;
全文搜索引擎默认的分词器对中文支持也比较差,需要替换成中文分词插件。
你可以先用一条简单命令验证当前效果。
如果使用 Elasticsearch,执行:
curl -X POST "http://localhost:9200/_analyze" -H 'Content-Type: application/json' -d'
{
"analyzer": "standard",
"text": "网站站内搜索分词优化"
}
如果返回的 token 是单个汉字,说明分词器没适配中文,需要继续往下配置。
准备工作和环境检查
在动手之前,先确认你的搜索服务版本和运行状态。
Elasticsearch 可以用 curl http://localhost:9200 查看版本号,MySQL 可以用 mysql -V 查看版本。
中文分词插件通常需要和主版本号对应,版本不匹配会导致启动失败。
安装中文分词插件时,建议通过官方插件管理命令操作,不要手动复制 jar 包。
以 Elasticsearch 为例,进入安装目录后执行:
bin/elasticsearch-plugin install analysis-ik
如果是宝塔面板环境,可以在软件商店找到 Elasticsearch 管理界面,在插件管理里搜索 ik 并安装。
安装完成后必须重启搜索服务,否则插件不会加载。
重启命令一般为 systemctl restart elasticsearch,宝塔面板则直接点击重启按钮。
重启后再次执行前面的分词测试命令,把 analyzer 换成 ik_smart。
如果返回的是“网站”“站内”“搜索”“分词”“优化”这样的词语,说明中文分词插件已经生效。
把分词器应用到索引和搜索字段
插件装好只是第一步,还需要在创建索引时指定字段使用哪个分词器。
下面是一个最小化的索引配置示例,适合文章标题和正文的搜索场景:
PUT /article_index
{
"settings": {
"analysis": {
"analyzer": {
"ik_analyzer": {
"type": "custom",
"tokenizer": "ik_max_word"
}
}
}
},
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_smart"
},
"content": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_smart"
}
}
}
}
这里 ik_max_word 用于写入时尽可能多地切出词语,提高召回率;ik_smart 用于搜索时做较粗粒度的切分,避免把用户查询切得太碎。
这种组合是中文搜索适配中比较常见的做法。
如果索引已经存在,需要先关闭索引、更新 mapping、再重新打开,或者直接重建索引并重新导入数据。
重建索引前记得备份原数据,避免操作失误导致数据丢失。
容易踩坑的几个地方
第一个坑是插件版本和搜索服务版本不一致。
安装前先确认版本对应关系,不确定时查看插件官方说明。
第二个坑是只改了写入分词器,没有改搜索分词器。
这样会导致写入时切得很细,搜索时却用默认分词器,结果依然不准确。
两边都要检查。
第三个坑是忽略了自定义词库。
像“站内搜索”“分词优化”这类组合词,如果分词器不认识,会被拆成更小的单位。
可以在 ik 的配置目录下编辑 custom/mydict.dic,每行写一个词,保存后重启服务。
第四个坑是数据量不大却盲目上 Elasticsearch。
如果文章总量在几千条以内,MySQL 的全文索引配合 ngram 分词器也能满足基本中文搜索需求,不必增加一套搜索服务的维护成本。
验证优化效果和持续调整
配置完成后,不要只看一条查询就下结论。
准备五到十条典型搜索词,包括短词、长词、组合词和错别字,分别测试召回数量和结果排序。
可以在搜索接口返回结果中打印命中的分片和评分,观察是否有明显异常。
如果发现某些词依然搜不到,用 _analyze 接口单独测试该词的分词结果。
分词结果符合预期但搜索无结果,再检查字段 mapping 是否真的应用了分词器,以及数据是否已经重新索引。
站内搜索分词优化不是一次性的工作。
随着内容增加,新的专有名词和组合词会不断出现,建议每隔一段时间把搜索无结果的词记录下来,补充到自定义词库中。
这样中文搜索适配的效果会随着内容积累逐步提升。
如果你正在处理网站站内搜索分词优化和中文搜索适配,建议先按本文步骤完整执行一遍,再根据自己的数据量和服务器环境做微调。
遇到异常时优先回看避坑部分,多数问题都能在那里找到原因。