现场是这样的。编辑从 Word 粘贴标题,带进了不换行空格,页面上看不出差别。搜索结果标题前面空出一大块,必应还把整条标题当成两个不相关的片段,排名跟着掉。

中间走过弯路,把「sitemap 里的 title 与页面不一致,多了一个实体」当成主因,改完现象没变。

排查方向其实有限,先把可能性排一排。nbsp 被当成可见字符参与分词,产生空词;标题在数据库里前后带空格,模板没有 trim;摘要复制标题时把实体一起带出来。

上来先检查标题里的不可见字符

python -c "t=open('t.txt').read();print([hex(ord(c)) for c in t if ord(c)>127][:10])"

批量找出带 nbsp 的标题

mysql -e "SELECT ID FROM posts WHERE post_title LIKE '% %';" -N

随后清理首尾空白和实体

mysql -e "UPDATE posts SET post_title=TRIM(REPLACE(post_title,' ',' ')) WHERE post_title LIKE '% %';"

末了抽查修改后的页面输出

curl -s https://www.example.com/p/1 | grep -o '<title>[^<]*</title>'

怎么算真的好了,看的是同一批现象。标题里不再有不可见字符,搜索结果开头对齐,标题被拆成两段的情况消失。

容易忽略的是,从 Word 或微信复制的内容常带隐藏字符,入库前统一清洗一次省很多事。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。

作者 9823189