这事儿得从我刚开始搞点小玩意儿的时候说起了,那时候我还在折腾我自己的那个破网站,想着弄个站内搜索。一开始也没啥花里胡哨的想法,就想让用户搜点啥东西,能找到就是赚到。
我记得我最开始用的那套搜索方案特别傻瓜式,就是用数据库的 Like 语句在那儿瞎扫。用户输个词,我就写个 SELECT FROM articles WHERE content LIKE '%用户输入%' 这么一整。
结果发现这玩意儿速度慢得要死,数据量稍微起来点,一搜就得转好几圈,用户等得都快睡着了。更要命的是,搜出来的结果特别不靠谱,用户搜个“苹果”,结果啥“香蕉”、“橘子”的都跑出来了,完全不搭边。
从“瞎扫”到“关键词匹配”
我当时就寻思着,不行,得找个正经的搜索方案。后面我开始研究那些开源的全文搜索引擎,折腾了好一阵子,终于把 Elasticsearch 弄到了我的小服务器上。当时我是抱着试试看的心态,想着这玩意儿应该能解决我的匹配问题。

我把网站所有的文章内容都给它喂了进去,然后开始尝试搜索。输入“同归于尽”,它能给我搜出包含“同归”的,也能搜出包含“尽”的,但如果用户搜“同归”,我发现它能给我匹配到很多包含“同归”的文档,这感觉比以前的 Like 强多了。
但是,问题很快就来了。用户搜“搜索同归是什么意思”,我本意是想让他找到那篇专门解释“同归”的文章。结果它给我列出来一大堆,有的文章标题里有“搜索”,有的文章内容里有“同归”,有的甚至只有“意思”两个字。
我仔细看了下配置,发现 Elasticsearch 默认的分析器会把这句话拆成一堆词,比如“搜索”、“同归”、“是”、“什么”、“意思”。然后它只要文档里有其中任何一个词,就给我算个相关度得分,然后按得分排序。
“同归”的陷阱
我特别郁闷,用户想找的是一个明确的概念,结果出来一堆七零八碎的文档。我当时就琢磨,这才是“搜索同归”的精髓所在——你输入了一堆词,它给你返回了所有包含这些词的记录,但是你怎么知道哪个才是你真正想要的那个“同归”?

这时候我才明白,所谓的“搜索同归”,不是说搜索结果里必须有“同归”这两个字,而是搜索引擎根据你输入的这一串查询词,把自己索引库里所有符合某种规则的文档都找出来,这就是一种“同归”——所有匹配的文档都归拢到一起了。
比如用户搜“狗 链条”。
- 文档 A 提到“狗”和“链条”,得分最高,排最前。
- 文档 B 只提到“狗”,得分次之。
- 文档 C 只提到“链条”,得分更低。
这三篇文档,不管内容贴合度如何,只要包含查询词,都被拉到搜索结果这个“大锅”里了,这就是搜索结果的“同归”。
的优化
为了解决我前面说的那个问题,我开始折腾评分机制和查询语句。我把查询的权重给调整了,让标题里有“同归”的文档得分翻倍,内容里有“同归”的文档得分正常算。
我还尝试了短语匹配(Phrase Query),让用户搜“搜索同归是什么意思”的时候,如果能搜到恰好连续出现这五个词的文档,分数直接拉满。这样一来,那篇我真正想让用户看到的解释性文章,就稳稳当当地排在了第一位。
搜索同归不是一个高深的概念,它就是搜索引擎把所有跟你输入的关键字相关的结果都找出来,然后根据一套算法给你排个序。重点在于,你怎么去优化这个排序算法,让那个你“想让用户看到的那个同归”,排到最前面去,这就考验你的技术了。









