Elasticsearch——搜索引擎原理(一)

前言

搜索引擎三大过程:爬取内容、进行分词、建立反向索引。

倒排索引

很多搜索引擎是基于倒排索引,不过在倒排索引之前,我们先看看正排索引

正排其实就是数据库表,他通过id和数据进行关联。我们可以通过搜索id,来获得相应的数据,也能删除数据。你买了一本书,书的目录其实也是正排搜索。

数据id 数据内容
1001 苹果公司发布iPhone
1002 地球引力起源于苹果
1003 iPhone屏幕碎了
1004 我在苹果商店维修屏幕
1005 我刚刚吃了苹果

但是我们如果通过具体数据内容苹果去搜索,就要去表中每一行的数据去匹配,如果数据量很大,很影响性能。

其次,这个时候我想搜索苹果iPhone,那么我们无法把这词汇拆开再到数据库去搜索。

  • 优点:使用起来方便,原理也简单,比较入门

  • 缺点:检索效率低下,适合简单场景使用,比如传统项目,数据量较小的项目。不支持分词搜索。

倒排索引与正排索引正好相反,他会把文档内容进行分词,比如苹果公司发布iPhone是一个文档数据,当我们把他存入到搜索引擎中去的时候,会有一个文档id,这个文档id就类似于数据库主键。但是这文档存储的时候和数据库不一样,他会进行一个分词,参照上面的表格,分词后的结果如下:

文档数据 分词结果
苹果公司发布iPhone 苹果,公司,发布,iPhone
地球引力起源于苹果 地球,引力,起源,于,苹果
iPhone屏幕碎了 iPhone,屏幕,碎了
我在苹果商店维修屏幕 我,在,苹果,商店,维修,屏幕
我刚刚吃了苹果 我,刚刚,吃了,苹果

每一个词汇都会和文档id关联起来,可以根据词汇来找到所有出现的id列表,如下:

词汇 文档ids
苹果 1001,1002,1004,1005
iPhone 1001,1003
屏幕 1003,1004
碎了 1003
1004,1005
1004
商店 1004
维修 1004
刚刚 1005
吃了 1005
····

假设现在我要搜索iPhone,如果是数据库搜索,假设有1亿条数据,那么会匹配1亿次,全表扫描。最后再把数据返回出来。

如果是搜索引擎,那么有可能第一次就把所有文档数据给查出来,当然也有可能是第N次,当然他肯定要比数据库的搜索效率更高。如图中位置,他会直接把1001,1003两个文档返回。

而且搜索引擎是直接把关键字做匹配,相同当量的数据,效率肯定也是后者更快。

  • 优点:搜索更快,耗时短,用户体验高,精装度也高

  • 缺点:维护成本高,索引新建后要修改,必须先删除,前期需要很好地规划

分词

分词可以说是搜索引擎的基石,如果一个搜索引擎没有好的分词器那么这个搜索引擎必然是失败的。

搜索是以词作为最小单元,依靠分词器进行构建,最后会生成一个倒排索引。

分词器就负责拆分我们的语句。比如“my name is nijunyang”。分词的时候会处理掉一些区分度不高的词,英文中“is,are”,中文“的,是”这些之类。

通过分词之后结果再次指向原来的文档,通过value反向生成key(多个),这就是倒排索引。而我们以前的那些正向索引是先key-value,一般来说是一一对应,而且key也不是通过value去生成。

爬取内容

搜索引擎蜘蛛通过跟踪链接访问网页,获得页面HTML代码存入数据库。

文章目录
  1. 1. 前言
  2. 2. 倒排索引
  3. 3. 分词
  4. 4. 爬取内容
|