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
这就是倒排索引的精髓所在。