这个题目来自知乎上的一个问题,我今年初开始做搜索相关的工作,到今天已经整整7个月,于是想借这个题目将自己所理解的搜索引擎原理写下来。
我不是专业的搜索工程师,日常工作主要是做搜索产品评测,这个身份的缺点是自己的理解会有一些局限性,优点是写出来的内容比较通俗易懂。
希望通过这些内容能帮助大家更好的理解搜索产品。
搜索引擎的第1步:抓取内容。
百度、360以及搜狗等通用搜索引擎的处理对象是整个互联网中上千亿的网页,所以搜索引擎需要面对的首要问题是如何将这些网页下载到自己的服务器上。
进行这一任务的是一种被称为“网络爬虫”的程序,搜索引擎会派出无数的“网络爬虫”按照一定的策略(如广度优先或者深度优先)完成网页抓取任务。
知乎的搜索是站内搜索,处理对象是自己网站的内容,在用户完成内容生产的同时,这些内容就存储到了知乎的服务器上。所以这一步对知乎来说是没有问题的。
搜索引擎的第2步:建立索引。
索引过程中一个很重要的步骤是分词,如这句话“化妆品和服装”,正确的分词方法应该是[化妆品][和][服装],如果将“和”、“服”两个字结合分成“和服”的话那么结果自然就不会相关。分词背后需要有强大的词库储备(并且需要时时更新),以及强大的语义理解系统(比如上面的例子中,“和服”是一个有意义的词,但在这个场景下这样分词是有问题的)。
搜索引擎会为每个网页(文档)建立索引,其中可能包括网页包含的词组、词组出现的位置(比如“北京大学”这个词,如果拆分成“北京”和“大学”两个term,那么这两个term的位置一定要紧挨着,并且北京在前,否则语义会发生极大的变化)和频率、网页的内外链、甚至qanchor数据(如果用户搜索“A"这个关键词,点击了网页“B",那么 B就是A的qancher)等。这些因子在决定搜索结果排序中都有很大的影响。
因为知乎的独特性,每个回答对应的索引除了上面提到的部分因素外,还可能会包括赞同数、反对数、感谢数、所属的话题、回答者(以及擅长的话题)等等。当然包含的因子越多,对搜索引擎的存储和计算性能等都是巨大的挑战。
建立索引这个步骤难度较大,即便是通用搜索引擎也在不停的优化。
搜索引擎的第3步:确定排序。
当用户输入一个query后,备选结果集合中的每一条结果最终会通过一系列计算过程最终得到一个分数,然后按照分数从高到低排序。一条结果的得分高低主要跟下面几个因素有关,当然每个因素的权重因子也需要不断的调整来提升准确性。
1、文本相关
这个很好理解,网页(问答)中包含的词组需要和搜索词一致。
2、用户行为模型
对知乎中的回答来说,有以下几个真理:
/点赞多的结果要好于点赞少的结果;
/反对少的结果要好于反对多的结果;
/自己点过赞的结果要好于普通的结果;
/擅长问题所属领域的回答者的答案要好于普通的回答者;如张三很擅长回答搜索领域相关的问题,李四擅长回答金融领域相关的问题,那么对于一个搜索领域的问题,张三的回答要好于李四的回答。这其中用户擅长的话题可以采用用户自己标注或者官方标注的方式,也可以根据用户的回答记录智能标注,比如现在很多领域中都会推荐最佳回答者。
/用户最终有效点击了的结果要好于用户没有点击或者是无效点击的结果。所谓有效点击指的是用户点击并且有合理的停留时间,而不是点击之后很快就走了。
3、网页质量
在搜索引擎中如果某个网页被识别为网页质量差(作弊,广告多,页面空短),那么会被严重降权甚至屏蔽。
知乎上最近有人涉嫌借助知乎做问答营销,如这篇文章提到的,这类结果除了依靠用户举报外也需要用户算法来识别。此外抖机灵的回答某种程度上也需要进行打压。
搜索是个很复杂的产品,技术门槛比较高,其中包含非常多的策略。即便是通用搜索引擎目前也在不断优化当前的策略,同时也在添加新的策略。比如时效性策略,同义词策略,网页质量策略,网站权重策略等等。