尽量覆盖搜索引擎的核心原理,不要覆盖数据挖掘、NLP等。文章有点长,多指点~ ~
什么是搜索引擎?
这里有一个概念需要提一下。信息检索和搜索是有区别的。信息检索是研究信息的获取、表示、存储、组织和访问的学科,而搜索只是信息检索的一个分支。问答系统、信息抽取、信息过滤等其他信息检索系统也可以是信息检索。
本文要讲的搜索引擎是全文搜索引擎和垂直搜索引擎的一般原理,比如Google、百度、天猫搜货、口碑搜食、飞猪搜酒店等等。
Lucene是一个著名且高效的全文检索工具包。Lucene用在ES和Solr的底部。本文的大部分原理和算法将以Lucene为例进行介绍。
看一个实际的例子:如何从一个有数十亿数据的商品列表中找到一个名为“长裤”的商品。
使用类似SQL
从名称类似“%长裤%”的项目中选择*
如上,大家能想到的第一个实现就是用like,但是这个不能用上索引,而且会遍历大量数据集,查询会很慢。有没有更简单的方法?可以说可以加一个长裤的类别或者标签。很好。如果增加一个新的商品类别呢?要不要加无数分类和标签?我们如何更简单有效地处理全文检索?
使用搜索引擎
答案是搜索,它会提前构建一个倒排索引,通过词法语法分析、分词、词典构建、倒排表构建、压缩优化等操作来构建索引。查询时,可以通过字典快速得到结果。这样既可以解决全文检索的问题,又可以解决SQL查询速度慢的问题。
那么,淘宝是如何在一毫秒内从几亿个产品中找到几千条长裤的,谷歌是如何在一毫秒内从几万亿个网页中找到几十万个匹配你关键词的网页的,这么大的数据量是如何在几毫秒内返回的呢?
第一部分。分词
分词是通过规则或算法将一段文本分割成多个单词,每个单词被视为搜索中最细的单个单词或单词。只有分词后有这个词,才能找到搜索,分词的正确性很重要。分词粒度过大,搜索召回率低,分词粒度过小,准确率降低。如何恰当地分词是搜索引擎需要做的第一步。
精度粒度
分词正确性
分词粒度
分词的粒度不要越小越好,这样会降低准确率。比如搜索中秋会出现之前的结果,粒度越小,索引字典越大,搜索效率也会降低,后面会详细描述。
如何精确控制分词涉及到NLP的内容,这里就不展开了。
停止言语
很多句子中的单词是没有意义的,比如副词和谓语“的”“在”,英语中的“一”“一”“该”在搜索中是没有意义的,所以在分词中构造索引的时候会去掉,减少不必要的索引空间,停词。
停用词通常可以通过文档集的频率和维护禁用词汇的方式来判断。
术语处理
术语处理是指对原始术语进行一些额外的处理,如归一化、形态合并、词干恢复等,以提高搜索效果。不是所有的需求和业务都需要处理条款,需要根据场景来判断。
1.正常化
美国-美国[缩写]
7月30日-7月30日[中英文]
颜色-颜色[通过错误的词语]
快乐-快乐[同义词扩展了类别]
这样查询美国就可以得到美国的结果,同义词可以算作规范化处理,但是同义词可以用其他方式处理。
2.词形合并(引理化)
鉴于同一单词在英语中的不同形式,可以将其合并为一种单词形式,例如:
是,是,是-是
汽车,汽车,汽车的,汽车的汽车
男孩的车是不同的颜色-男孩的车是不同的颜色
3.茎缩减
通常指粗略去除两端词缀的启发式过程
开心——开心[中文叠字还原]
很明显。-明白了
英语中常见的词干缩减算法,波特算法。
要理解倒指数,先看什么是远期指数。例如,有以下两句话:
Id1,“搜索引擎提供检索服务”
Id2,“搜索引擎是一个信息检索系统”
正指数
正向索引是MySQL中的B树,索引的结果是:
“搜索引擎是一个信息检索系统”——id2
“搜索引擎提供检索服务”-id1
意思是将字典中完整的内容进行排序,以得到一个有序的列表,从而加快检索速度。
反转标牌
第一步是分词
“搜索引擎-提供-检索-服务”灯塔