ElasticSearch快速入门(一)

一、ElasticSearch是什么?

ElasticSearch是与搜索相关的技术,ElasticSearch是一个搜索服务器。(以下文章将ElasticSearch简称为ES)服务器的概念我们都明白,我们知道有tomcat,mysql等等。是可以对外提供服务的软件,ES也是同理,它也是一种对外提供的服务的软件,只不过不同的是,他提供的是搜索的服务。

提到搜索大家能想到什么呢?是不是会想到谷歌、百度、这些搜索网站?但其实这是一个很广泛的应用,比如在网易云中搜索一首你想听的歌曲,或者是在京东或者淘宝中搜索你想购买的商品,这些都是搜索。其实说得简单一些,搜索就是查询。

有一些朋友看到这里就会想,搜索原来就是查询啊,查询我会啊,不就是 "select * from xxx" ? 这个sql是做查询没有错,但是这是关系型数据库中的查询,这样的话我们还需要学习ES吗?我们刚才提到的那些京东,淘宝等大型电商网站他们是用这样的方法做查询的吗?显然不是,那接下来就引出了关系型数据库中做查询和ES中做查询的区别,以及我们为什么要用ES来做查询。

二、为什么要用ElasticSearch?

我们要知道为什么使用ES,首先我们先要知道用关系型数据库到底有什么问题

数据库查询的问题

我们要搞清楚 这个问题,首先来看一张表

基于这张商品表,我向大家提一个问题:请查询title中包含‘手机’的信息?

这是一条很简单的sql,我相信大家都可以写出来:select * from 表名 where title like '%手机%';

这条sql我们很轻易的就可以写出来,也可以得到我们想要的结果,但是我们现在需要来分析一下这条sql到底有什么问题?

问题一:如果我们用这种 'Like' 的方式进行模糊查询,如果在查询条件的左边加了 '%' 这种通配符,那么将来在title这一列上,用的索引将会失效。索引失效就意味着你在执行这条sql的时候他会一条一条的去比对,假设你表中的数据有一亿条,那就意味着将会去比较一亿次!这个性能多差就不需要我多说了吧。

接下来聊另一个情境:请查询title中包含‘华为手机’的信息?

有些朋友看到这里就会问我了,这个问题和上一个问题有什么区别呢?这不是一样么?我也能写出来啊,不就是:

select * from 表名 where title like '%华为手机%';吗?很简单,是不是又要说逐条比较?性能低?条件前加通配符索引会失效?这些我已经知道了啊。

别着急,我们来看问题二。

问题二:这条sql看起来是查询含有华为手机的模糊查询,但事实上我想要的是结果中带有华为或者是手机的信息,换句话说呢,其实就是华为与手机的并集。但是这样写sql是查不出我想要的结果的。有些童鞋看到这里可能还是没有明白我的意思,那我给大家举个栗子:

以京东为例:

大家可以看到这个结果中的高亮字体,是不是华为与手机的并集?可能这是搜索结果的第一页效果并不明显,我们来看看最后一页会展示给我们什么内容:

我们可以看到在最后一页中为我们展示的有华为的充电线和平板电脑等内容,还有手机壳等我没有给大家截出来的一些商品内容,大家可以看到这个搜索结果为我们展示出来的,就是‘华为’和‘手机’得并集。也就是说他并不是华为的手机,但是也被搜索出来了,这才是所期望的效果,而上面这条sql显然是无法满足我们需求的。这就是我们的问题二:关系型数据库目前为我们提供的查询,功能还太弱。

那ES是怎么解决的呢?ES的实现是基于一个方法:倒排索引

三、ElasticSearch是怎么解决我们的问题的?

在上文中,我已经告诉大家ES是用倒排索引来解决问题的,那我们接下来就来聊一聊什么是倒排索引

在聊之前先来举个栗子:

问题:请大家说出包含“前”的诗句?

如果没有想到请看第二个问题:

问题:请背诵《静夜思》?

答:床前明月光,疑是地上霜。

       举头望明月,低头思故乡。

现在再问大家一个小问题,为什么刚才在问请背诵包含“前”的诗句时就想不起来,而问背诵《静夜思》时就可以背诵出来,并且能一下想到,奥!窗明月光,这就是包含“前”的诗句啊。其实原因很简单,因为在我们的大脑中我们是这样存储数据的:

这种存储方式就叫做:正向索引。它是以其唯一标识也就是诗歌的题目,与诗歌内容作为一一对应关系的。所以当我问背诵包含“前”的诗句时就会感觉一下想不起来。

想要回答出我第一个问题那就需要建立一种反向的索引,也就是倒排索引。他具体是怎么做的呢?

首先要对诗句进行分词:

“床前明月光” ---> 分词

分词的意思就是将文本按照一定的规则,拆分为不同的词条(term)

拆分完毕之后再建立一个词条与文本的对应关系,如下图:

同样的,我们再来一句古诗:“明月几时有”。把他和“床前明月光”一起组合到倒排索引表中长这个样子:

这时,我们之前有的词条不用动,只需要把这句古诗放到对应的词条的值中,用逗号隔开就可以。把新加的词条放在下面并且写上对应的古诗诗句的内容放在对应的值中。这时如果我问你不管是包含哪个分词内容的诗句,你都可以很快的回答上来,但是在这样的解决办法中其实也有弊端,什么弊端呢?举个例子说,“月”这个词条中会有很多很多的诗句放在这个值中,那在遍历在找的时候,速度可能就没有那么快了,那我们怎么解决呢?其实也很简单,那就是只需要把诗句的唯一标识放在这里就可以了。也就是把这句古诗的题目,放在这里。那它就会长这个样子:

看到这里,我们可以总结一下:

倒排索引:将各个文档中的内容,进行分词,形成词条。然后记录词条和数据和词条的唯一标识(id)的对应关系,形成的产物。

讲了这么多ES是怎么解决我们问题的,接下来我们分析一下ES是怎么做的。

四、ElasticSearch数据的存储和搜索原理

1.ES的简单概念

首先为大家引入第一个名词:“索引库”(index)

既然ES是做数据存储和搜索的,那么首先,他需要一个地方来存放数据,这个地方在ES中就叫做索引库,英文单词就是index,它的概念,就和我们在关系型数据库中学到的“database”数据库的概念是一样的。ES将数据存储在索引库中。

接着为大家引入第二个词:“文档”(document)

那存放数据的地方有了,就要往里添加数据了,在ES中数据也有它独特的称谓:“文档”,这个文档就相当于我们关系型数据库中,表中的一条数据。而在ES中的一条数据就叫做document,文档。

存放数据的地方(index)“索引库”有了,(document)“文档”也就是数据也有了,那么用户就可以搜索自己想要的数据了。

如下图所示:

2.ES的存储和搜索

1.ES的存储

首先我们将数据的存储,先要知道存在ES中的数据(document)长什么样子,如下图所示:

在上面的图中,我们为大家展示了,存在ES中的三条数据,也就是三条document文档,每一条document都有一个id,有一个title,有一个price,首先大家可以看这个结构,这个有的同学可能已经发现了,这不就是JSON的数据格式吗?对,独秀同学可以坐下了,你说的很好,这就是JSON的数据格式,键值对的形式。

然而,仅仅知道这个还是不够的,下面我来为大家举个栗子:假设我们将这三条数据存入索引库中,我们将来要对title这个字段的内容进行分词,分完词之后是不是就会形成一个倒排索引?当然分词的过程我们是不需要关心的,这个过程会由ES来自动尾门实现,但是我们可以先来设想一下存了数据之后,分完词之后的样子,如下图:

我相信从上面一直看下来文章的小伙伴一定可以看懂这个分词的表格,再次我就不赘述了。

好了,相信小伙伴们看到这里觉得ES也不过如此嘛,很简单~。大家不要心急,再耐心的让老夫给大家絮叨一下搜索。

2.ES的搜索

既然说到了搜索,那么就不得不再说一下关系型数据库,让我们把关系型数据再拿出来说说他的问题:

1.性能低:使用模糊查询,左边有通配符,不会走索引,会全表扫描,性能低。

2.功能弱:如果以“华为手机”作为条件查询不出来数据

那么我们通过ES能不能解决上述的两个问题呢?让我们再来看一张图:

上面为童鞋们展示的就是我们数据存在ES之后,分词后的词条和词条id的对应关系。再让我们举个栗子:请使用“手机”作为关键字来查询。如果是关系型数据库怎么做呢?是不是会做模糊查询然后引起全表扫描呢?那我们的ES是怎么做的呢?它首先,会拿着“手机”这个词去我们分词词条的那一列,也就是term,去一一对比,有的同学看到这就嘀咕了,嗯?一一对比啊?那不是效率也很慢吗?我们之前说过,分词只有新分出来的词才会去添加到term这一列,而已有的词只会将包含这个词的document的id以逗号的形式分隔开添加在后面,假设,表中有一亿条数据,难道能分出一亿个不同的词条吗?显然是不会的。

可是我们独秀同学的凳子上又长钉子了,他站起来问我,那你这是运气好,手机这个词在中间,假设真的有一亿条term,而你要找的那个词又在最后一个,那怎么办呢?好了独秀同学你可以坐下了。你能想到的,ES其实早就为我们想好了,在ES内部有一个机制,词条这一列,在创建倒排索引的时候,他有一个对词条排序的动作,也就是说,词条它是有顺序的,排好了顺序之后,它就形成了一棵树形结构,这样就会提升查询的速度。有了树形结构在查询的时候,那是不是就会一下过滤掉一半的数据,所以独秀同学心里还是要有一点B树的。

我们再来看看第二问题,关系型数据库无法以“华为手机”为关键词来作为搜索依据,也就是功能弱来用ES解决一下。

在ES中如果我们以“华为手机”为关键词查询的话,ES是怎么做的呢?有的同学说词条中没有华为手机这个词啊,结果不还是查不到吗?当然不是这样的,在ES中如果我们输入一个搜索条件,比如说“华为手机”,他会进行先分词后查询的动作。也就是说ES在搜索的之后,他可以将"华为手机"这四个字分为两个词,一个是“华为”,一个是“手机”,这个过程是自动的。于是就分别通过查到的词条找到每个document(文档),可以求交集,也可以求并集,如果是求交集,那就是华为:1,3,如果是求并集,那就是手机:1,2,3。

文章看到这里,我相信小伙伴们已经明白了ES存储和搜索的原理,也知道了倒排索引是怎么解决问题的,关于ES更多关于API的操作,我会在后续的文章中为大家详细阐述。

 

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Elasticsearch是一款非常强大的开源搜索引擎,它可以帮助我们从海量数据中快速找到需要的内容。它是elastic stack(ELK)的核心组件之一,结合kibana、Logstash、Beats等工具,被广泛应用在日志数据分析、实时监控等领域。\[1\] 在Elasticsearch中,为了提高搜索的性能,它使用了倒排索引的概念。倒排索引是指将文档中的每个词都建立索引,然后通过这些索引来快速定位到包含该词的文档。当我们向Elasticsearch插入一条记录时,它会将记录中的字段建立倒排索引,以便能够快速搜索和检索数据。\[2\] 为了能够快速找到某个词,Elasticsearch使用了Term Dictionary。Term Dictionary将所有的词进行排序,并使用二分法查找词,类似于我们在学校时老师教我们使用字典的方式。这种查询方式类似于传统关系型数据库的B-Tree索引方式,但并不是Elasticsearch快速的原因。\[3\] 以上是elasticsearch快速入门介绍。 #### 引用[.reference_title] - *1* [Elasticsearch快速入门](https://blog.csdn.net/ks_1998/article/details/121237513)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [【ElasticSearchElasticSearch 快速入门(精讲)](https://blog.csdn.net/m0_45067620/article/details/120377816)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值