看起来它“多找了两篇”,其实是搜得太认真了 😂
你的搜索逻辑不是只搜标题,而是同时在这几处做 includes 匹配:
titlecategoryexcerptcontentHtml(整篇文章的内容)当你搜“布局 / flexbox”时:
再加上你实现的排序权重(标题>分类>摘要>正文 + 轻微按日期加权),所以“标题命中”的 Flexbox 卡片排在最前面,另外两篇跟在后面。这和你截图里的顺序一致。
最小改动,保留体验直觉:搜“标题里的词”。
把 baseFilter 里参与匹配的字段去掉 contentHtml:
// 原来:
const fields = [
(a.title||''),(a.category||''),(a.excerpt||''),(a.contentHtml||'')
].map(s => s.toLowerCase());
// 改成:
const fields = [
(a.title||''),(a.category||''),(a.excerpt||'')
].map(s => s.toLowerCase());
这样“布局”就不会因为正文里偶然出现而把其他文章也带出来了。
如果你确实想让“正文命中”也算结果,那就把命中片段摘出来,放到卡片摘要中展示并高亮;并在计数提示里标注“标题/摘要/正文”命中来源。思路如下:
update() 里,当标题和摘要都不命中但正文命中时,动态生成一段“命中上下文片段”(例如向前后各取 20~40 个字)。