引子
很多搜索引擎都是基于倒排索引比如luncenesolr以及elasticsearch
正排索引
聊倒排搜索之前先来看看正排索引正排其实就是数据库表他通过id和数据进行关联如下
数据id | 数据内容 |
---|---|
1001 | 苹果公司发布iPhone |
1002 | 地球引力起源于苹果 |
1003 | iPhone屏幕碎了 |
1004 | 我在苹果商店维修屏幕 |
1005 | 我刚刚吃了苹果 |
我们可以通过搜索id来获得相应的数据也能删除数据。你买了一本书书的目录其实也是正排搜索。
假设现在我要搜苹果
俩字那么他会对这张表格中每一行的数据做匹配去查找一下是否包含苹果
这两个字从第一条匹配到最后一条如果一张表中数据量不多几万十几万那么问题不大但是一旦数据量有上百万上千万那么全表扫描这种的搜索性能就会有影响。
其次这个时候我想搜索苹果iPhone
那么我们无法把这词汇拆开再到数据库去搜索。
- 优点使用起来方便原理也简单比较入门
- 缺点检索效率低下适合简单场景使用比如传统项目数据量较小的项目。不支持分词搜索。
倒排索引
与正排是反着来的他会把文档内容进行分词比如苹果公司发布iPhone
是一个文档数据当我们把他存入到搜索引擎中去的时候会有一个文档id这个文档id就类似于数据库主键。但是这文档存储的时候和数据库不一样他会进行一个分词参照上面的表格分词后的结果如下
文档数据 | 分词结果 |
---|---|
苹果公司发布iPhone | 苹果公司发布iPhone |
地球引力起源于苹果 | 地球引力起源于苹果 |
iPhone屏幕碎了 | iPhone屏幕碎了 |
我在苹果商店维修屏幕 | 我在苹果商店维修屏幕 |
我刚刚吃了苹果 | 我刚刚吃了苹果 |
每一个词汇都会和文档id关联起来可以根据词汇来找到所有出现的id列表如下
词汇 | 文档ids |
---|---|
苹果 | 1001100210041005 |
iPhone | 10011003 |
公司 | 1001 |
发布 | 1001 |
地球 | 1001 |
引力 | 1001 |
起源 | 1001 |
于 | 1001 |
屏幕 | 10031004 |
碎了 | 1003 |
我 | 10041005 |
在 | 1004 |
商店 | 1004 |
维修 | 1004 |
刚刚 | 1005 |
吃了 | 1005 |
假设现在我要搜索iPhone
如果是数据库搜索假设有1亿条数据那么会匹配1亿次全表扫描。最后再把数据返回出来。
如果是搜索引擎那么有可能第一次就把所有文档数据给查出来当然也有可能是第N次当然他肯定要比数据库的搜索效率更高。如图中位置他会直接把10011003
两个文档返回。
可能会有同学会问数据库和搜索引擎都是1000万数据搜索的词汇在搜索引擎中正好是第1000万条那么会不会慢其实这个肯定会比数据库更快数据库要匹配是一个文本中的内容和关键词匹配而搜索引擎是直接把关键字做匹配效率肯定后者更快。
- 有点搜索更快耗时短用户体验高精装度也高
- 缺点维护成本高索引新建后要修改必须先删除前期需要很好地规划
热门评论
233