一篇文章告诉你搜索引擎是如何工作的
搜索的普遍流程
搜索,推荐,广告三兄弟,整体的技术栈,流程框架是比较相似的。主要区别在于业务逻辑上的细微不同,但是可以肯定的是,搜索是三兄弟中最重要的。
搜索的整体流程同样是召回,排序两大块。但是除此之外,从一个完备的搜索引擎来看,要处理的事情远不止这么简单。总体来看,整个搜索可以看作这么几个阶段:
-
数据预处理 -
query understanding -
召回模块 -
排序模块 -
后处理
数据预处理
对于输入 query 第一步需要预处理为方便操作的形式,以供后续的步骤可以有效进行。常见的操作有:
-
无效内容的过滤:比如标点符号, emoji 表情,奇怪的字符等。 -
简繁体转化。 -
长度截断。 -
数字转中文,中文数字转阿拉伯数字等。 -
译名,别名等转化。 -
禁搜词,禁搜内容等过滤。
在预处理后可以获得一个比较规整的 query 字段,接下来对相应的 query 进行逐步处理。
QU/query understanding
QU 部分的内容并非一个搜索引擎必须的,但却是一个想要做好做优秀的搜索引擎必须的。整个 QU 部分的效果会对召回和排序阶段都产生巨大影响,而后续的无论召回还是排序都很依赖这一步的结果。
QU 部分的技术栈基本都是 nlp 的一些常见操作,总体来说是比 nlp 要简单的,因为目的很清晰,用户的 query 肯定是希望得到某类结果。具体主要是以下内容:
-
分词。这里也有常见的不同方法,大家可以针对性去了解对应的内容。 -
纠错。比如搜索周杰论,我们可能需要给纠正成周杰伦。 -
词干提取和词形还原。 -
命名实体识别。获得每个词的实体类型。 -
意图识别。分析用户的搜索意图,这个也要针对业务进行分析,比如电商搜索,音视频的搜索,网页搜素都不相同。
对于整个 QU 部分来说,为下游的工作起到一个至关重要的作用。这一步的效果在很大程度上决定了接下来的工作能做到的上限,如果你对 query 经过一系列处理,变得很差,那么后面的搜索步骤也无法取得好的效果。
召回模块
这里的方法其实主要是三类:
-
MySQL,Redis 等 keyword 直接精确匹配。这种方法简单直接,但是局限性较大。 -
ElasticSearch,也就是我们经常听到的 ES,一些不靠搜索吃饭的公司,基本上用 ES 就可以完成绝大多数需求了。 -
对 query 进行 embedding,然后利用诸如 BM25 等方案进行相似性召回。如果想要做个性化的推荐,就同时也可以考虑用户的历史行为作为 embedding 信息,一起加入进来。
排序模块
有的工程里面,会将排序再拆分粗排,精排,重排等等,但是本质上都是一样的,就是将召回拿到的内容,按照用户输入的 query 进行一个排序,将用户可能感兴趣的排到前面去。
其实这里的内容是大家经常看论文比较常见到的部分,各种模型和结构,各种奇思妙想,都基本上是以排序为主。
排序的核心其实主要就是三方面,一个是 query 的 embedding,一个是 item 的embedding,第三个是如何判断它们之间的相关性。大多数模型的工作也集中在这三点上。
但是就我的经验来看,实际应用中,简单的 LR 之类的模型,就可以解决百分之八九十的问题了。要想精益求精,才是接下来需要模型的时候。
其它内容
在搜索的过程中,一些其它辅助功能也很重要。首当其冲的是 suggest,对用户的输入进行提示和建议,这部分的内容也可以和纠错进行结合。
还有包括大数据分析的部分,毕竟搜索还是以 bad case 为驱动的,不像推荐,用户的容忍度比较高,对于 bad case 的分析和解决也很重要。
总结
这篇文章简要的介绍了一下一个搜索引擎需要做的工作,可能不接触这方面的人认为,搜索主要都在做排序算法方向的研究。通过这篇文章可以帮助大家了解到整个过程需要涉及到的技术,想要尝试做一些搜索方面工作的小伙伴也可以对照参考补充加技能点。
总的来说,搜索是一个对算法和工程能力都比较有要求的领域,无论是做算法还是做开发的朋友,都可以向这方面进行涉猎,也是一个很锻炼人的方向。
后面有机会我们再继续详细介绍相关的内容。
本文分享自微信公众号 - 机器学习与推荐系统(ml-recsys)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
敏感数据加密方案及实现
👆 这是第 73 篇 不掺水的原创 ,想要了解更多 ,请戳上方蓝色字体: 政采云前端团队 关注我们吧~ 本文首发于政采云前端团队博客:敏感数据加密方案及实现 https://www.zoo.team/article/data-encryption 前言 现在是大数据时代,需要收集大量的个人信息用于统计。一方面它给我们带来了便利,另一方面一些个人信息数据在无意间被泄露,被非法分子用于推销和黑色产业。 2018 年 5 月 25 日,欧盟已经强制执行《通用数据保护条例》(General Data Protection Regulation,缩写作 GDPR)。该条例是欧盟法律中对所有欧盟个人关于数据保护和隐私的规范。这意味着个人数据必须使用假名化或匿名化进行存储,并且默认使用尽可能最高的隐私设置,以避免数据泄露。 相信大家也都不想让自己在外面“裸奔”。所以,作为前端开发人员也应该尽量避免用户个人数据的明文传输,尽可能的降低信息泄露的风险。 看到这里可能有人会说现在都用 HTTPS 了,数据在传输过程中是加密的,前端就不需要加密了。其实不然,我可以在你发送 HTTPS 请求之前,通过谷歌插...
- 下一篇
「源码分析」CopyOnWriteArrayList 中的隐藏的知识,你Get了吗?
前言 本觉 CopyOnWriteArrayList 过于简单,寻思看名字就能知道内部的实现逻辑,所以没有写这篇文章的想法,最近又仔细看了下 CopyOnWriteArrayList 的源码实现,大体逻辑没有意外,不过还是发现很多有意思的地方,固留此篇文章分享之。 看完这篇文章你会了解到: CopyOnWriteArrayList 的实现原理,扩容机制。 CopyOnWriteArrayList 的读写分离,弱一致性。 CopyOnWriteArrayList 的性能如何。 CopyOnWriteArrayList 修改元素时,为什么相同值也要重新赋值(作者 Doug Lea 这么写都是有道理的)。 CopyOnWriteArrayList 在高版本 JDK 的实现有什么不同,为什么。 <!-- more --> 线程安全 List 在 Java 中,线程安全的 List 不止一个,除了今天的主角 CopyOnWriteArrayList 之外,还有 Vector 类和 SynchronizedList 类,它们都是线程安全的 List 集合。在介绍 CopyOnWrite...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8编译安装MySQL8.0.19
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2整合Redis,开启缓存,提高访问速度