什么是搜索引擎?深入搜索引擎原理

以前的工作经验都是和搜索有关的 , 现在有业务在用搜索 , 所以我跟搜索引擎分享一个原理 , 包括搜索的一系列核心数据结构和算法 , 并尽量覆盖核心搜索引擎原理 , 但不涉及数据挖掘、NLP等 。文章有点长 , 请大家指点~~
一、搜索引擎报价
什么是搜索引擎?
这里有一个概念需要提一下 。信息检索(简称IR)和搜索()是有区别的 。信息检索是研究信息的获取、表示、存储、组织和访问的学科 , 而搜索只是信息检索的一个分支 。其他如问答系统、信息抽取和信息过滤也可以是信息检索 。
本文要讨论的搜索引擎是通常意义上的全文搜索引擎和垂直搜索引擎的总原理 , 比如 , 百度 , 天猫搜索商品 , 口碑搜索美食 , 飞猪搜索酒店等
是一个非常知名且高效的全文检索工具包 。ES 和 Solr 都使用 .本文中的大部分原理和算法将作为示例进行介绍 。
为什么需要搜索引擎?
看一个实际的例子:如何从拥有数亿数据的产品表中找到名称中带有“曲库”的产品 。
使用 SQL 类似
select * from item where name like '%秋裤%'
如上 , 大家能想到的第一个实现就是用like , 但是这个不能用上索引 , 会在大量数据集上做遍历操作 , 查询会很慢 。有没有更简单的方法?也许我可以为长裤添加一个类别或标签 , 非常好 , 但是如果我添加一个新的产品类别呢?您想添加无数的类别和标签吗?如何更简单高效地处理全文搜索?
使用搜索引擎

什么是搜索引擎?深入搜索引擎原理

文章插图
答案是搜索 , 会提前建立倒排索引 , 通过词法分析、分词、词典构建、倒排表构建、压缩优化等操作建立索引 。查询时 , 可以通过字典快速得到结果 。这样既可以解决全文检索的问题 , 也可以解决SQL查询速度慢的问题 。
那么 , 淘宝是如何在1毫秒内从亿万产品中找到数千个长约翰 , 谷歌如何在1毫秒内从数万亿个网页中找到数十万个与您的关键字匹配的网页 , 这么大的数量怎么可能?以毫秒为单位返回的数据量 。
二、搜索引擎是怎么做到的?
Part1.分词
分词是通过规则或算法将一段文本分割成多个词 , 每个词作为最细粒度的词或词进行搜索 。只有分词后有这个词 , 才能搜索到 。分词的正确性非常重要 。分词粒度过大 , 搜索召回率低;如果分词粒度太小 , 准确率会降低 。如何正确分词是搜索引擎需要做的第一步 。
正确性和粒度
分词的粒度不是越小越好 。会降低准确率 。比如搜索“中秋节” , 会出现之前的结果 , 粒度越小 , 索引字典越大 , 搜索效率越低 。说吧 。
如何准确控制分词涉及到NLP的内容 , 这里就不展开了 。
停用词
很多句子中的词是无意义的 , 如“的”、“zai”等副词和谓词 , 英语中的“a”、“an”、“the”在搜索中是没有意义的 。所以在分词构建索引的时候会去掉 , 减少不必要的索引空间 , 称为stop word() 。
停用词通常可以通过文档集频率和维护停用词列表的方式来确定 。
词条处理
词条处理是指对原始词条做一些额外的处理 , 如归一化、词形还原、词干提取等 , 以提高搜索效果 。并不是所有的需求和服务都需要term处理 , 需要根据场景来判断 。