GET products/_analyze
{"analyzer": "ik_smart", "text": "电动汽车"}
GET products/_analyze
{"analyzer": "ik_max_word", "text": "电动汽车"}

标题里写「电动汽车」的商品,搜「电动汽车」只回 30 条,库里实际有 620 条。用 _analyze 看 ik_smart,切出来是「电动」「汽车」两个词。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:ik_smart 走最少切分,长词能不能成词取决于词典里有没有。词典里没有「电动汽车」,就退成两个短词。写入和查询用了不同的 analyzer 时,切出来的词对不上,召回直接掉。

「ik 分词粒度」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。同一份配置存在多处的,先确认改的是被加载的那一份。

新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。

处理上按这个顺序:建索引和搜索用同一个 analyzer 先对齐;把业务词补进自定义词典 放在主词典之后加载;要高召回的场景写入用 ik_max_word 查询用 ik_smart;改完重建索引 用 _analyze 对比 token。

确认没问题再收工,重建后搜「电动汽车」命中 620 条,_analyze 里出现完整词条。

作者 9823189