搜索框输入「网站优化」能搜到几篇文章,把词序换成「优化网站」就零结果,只输入一个「优」字反而能命中不少。乍看像缓存或者权限的锅,追下去往往不是。
SELECT ID FROM wp_posts WHERE post_status='publish' AND post_title LIKE '%优化%' AND post_title LIKE '%网站%';
追下去是这么回事:默认查询按空格切词,中文句子没有空格,整句被当成一个词去做整串匹配,语序一变就匹配不上,标题里的近义词也接不上,搜索范围被压得很窄。
「WordPress 中文分词」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。
能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。
具体做法是,先挂上 posts_request 过滤器,把实际执行的 SQL 语句打印到日志里看一遍;确认搜索词是被整串塞进 LIKE 还是被拆成了多个条件;改成按单字拆开再拼 LIKE 条件,每个字各自用 OR 连起来。
验收就看一点,换序搜索和拆字搜索都能出结果,两个不相邻的词也能命中同一篇文章。
