倒排索引介绍

ES是什么?

Elasticsearch(以下简称ES)是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基 于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发 布,是一种流行的企业级搜索引擎。Elasticsearch用于云计算中,能够达到实时搜索,稳定,可靠,快 速,安装使用方便。官方客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多 其他语言中都是可用的。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其 次是Apache Solr,也是基于Lucene

不知道大家有没有这样一个问题,京东、淘宝之类的电商平台,是如何在海量数据中找到我们搜索的内容的?

有人可能会说,MySQL就OK啊,搜啥有啥。

但是有没有想过,MySQL是怎么进行搜索的?当我们在搜索框输入需要搜索的内容时,比如“手机”,那么表单将词条提交给服务器,服务器使用模糊查询like来搜索数据库中的数据。表面上看似很完美,但是如果数据量十分庞大,就想淘宝一样有很多很多的数据,那么在使用MySQL的模糊查询时,由于模糊查询的索引是失效的,所以他就从表的自上而下一个一个的去查看数据,来找到含有搜索词条的数据,数据量小倒还好,但是数据量一但十分庞大,那么他的效率肯定是十分低的。

所以我们引入一个叫ES的搜索引擎。

ES是一款开源的搜索引擎,几乎市面上的所有的搜索引擎都会使用ES来做搜索。由于是非结构化数据库和他使用的倒排索引的数据结构,即可轻松加愉悦的解决面对大量数据而从容不迫去检索数据的难题。

正排索引

我们看上面的user表

如果我们按照user_id去查询,那么直接走索引,查询的速度非常快,但是当我们按照user_real_name去模糊查询的话,索引失效,MySQL就会逐行去获取数据,只有符合要求的加载到结果集,不满足要求的直接丢弃,相当于是把所有的数据全部跑了一遍,如果数据量非常大,那么效率就会差到离谱,如果是上百万的数据,那将会是一场灾难。

倒排索引

倒排索引的概念是基于MySQL这样的正向索引而言的。

倒排索引中有两个非常重要的概念:

文档( Document ):用来搜索的数据,其中的每一条数据就是一个文档。例如一个网页、一个商 品信息

词条( Term ):对文档数据或用户搜索数据,利用某种算法分词,得到的具备含义的词语就是词 条。

例如:白开水不如果汁好喝,可以得到如下词条,白开水、开水、水、如果、果汁,好喝。

创建倒排索引是对正向索引的一种特殊处理,流程如下:

1:分词

首先对文档中的内容进行分词,使用分词器来分词:

常用的分词器有:

        standard 分词器:他会将词汇单元转换成小写形式,并去除停用词和标点符号。

        simple 分词器:首先会通过非字母字符来分割文本信息,然后将词汇单元统一为小写形式。该                                  分析器会去掉数字类型的字符。

        Whitespace 分词器:仅仅是去除空格,对字符没有lowcase化,不支持中文; 并且不对生成的                                         词汇单元进行其他的规范化处理。

        还有Stop 分词器、keyword 分词器、pattern 分词器、language 分词器、snowball 分词器、                Custom 分词器、

中文分词器最常用的是:ik-analyzer        

IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。

当然在一些专业名词较多的数据库中,也会使用自定义的分词器。

2:索引构建

根据分词的结果,将构建相应词条在文档中出现的位置的id作为值,词条作为键进行存储。

3:开始搜索

当客户端完成请求后,会将请求携带的需要查询的词条和倒排列表中的词条进行匹配,当成功匹配以后,得到相应的文档id,再通过文档id进行查找相应的词典中的数据响应给客户端。

       

上表中将title中的内容进行分词,得到左边的表的数据,文档id就是该词条在左边文档中出现过的id,这样的话,通过客户端发送的请求中携带的搜索的内容和词条去匹配,得到相应的文档id,再通过文档id来查询内容,就会很快速的得到查询结果。

从文档到id,从文档到id,从文档到id

这就是倒排索引的精髓所在。

  • 22
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值