搜「手机」只出标题带手机的文章,搜「电话」又是另一批结果,客户说这两种说法在他们业务里是一回事。乍看像缓存或者权限的锅,追下去往往不是。

$map = ['手机' => ['电话', '移动电话'], '快递' => ['物流']];
$words = array_merge([$kw], $map[$kw] ?? []);
foreach ($words as $w) { $like[] = '%'.$w.'%'; }

追下去是这么回事:检索只做字面匹配,没有同义词表把两个词映射到同一组扩展词,换个说法就等于换了个主题,覆盖自然差一半,用户搜两次就流失了。

「搜索同义词」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。

先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。

具体做法是,先把业务里常见说法的同义词整理成一张对照表;搜索前把关键词扩展成一组词,原词本身也要保留;扩展出来的条件用 OR 连起来,不替换用户原本的输入。

验收就看一点,两个词搜出来的结果基本一致,原词命中的文章仍排在最前面。

作者 9823189