一、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的操作,我会在后续的文章中为大家详细阐述。

ElasticSearch快速入门(一)相关推荐

  1. ELK之ElasticSearch快速入门

    ElasticSearch快速入门 一.简介 二.下载 三.启动 4.基本概念 5. 一.简介 官网:https://www.elastic.co/ ElasticSearch是Elastic Sta ...

  2. Elasticsearch快速入门2 - 高级查询功能

    我们在Elasticsearch快速入门1中详细介绍了ES的安装.基本概念和一些基本的REST Api请求,在这篇入门(2)中,我们继续介绍ES的高级查询功能. 为了说明ES强大的搜索功能,我们还以上 ...

  3. 尚硅谷-SpringBoot高级-检索-Elasticsearch快速入门

    前面我们安装好了ElasticSearch,我以后就简称他为ES,而一些人还不知道基本的使用,那我们接下来做一个快速入门,了解一下他的使用方法,以及一些基本概念,方便我们后来整合,那么要学习ES最好的 ...

  4. Go Elasticsearch 快速入门

    文章目录 1.入门简介 2.基本概念 3.客户端库 4.创建客户端 5.index 增删改查 6.增加 7.删除 8.修改 9.查询 10.小结 参考文献 1.入门简介 Elasticsearch 简 ...

  5. ElasticSearch快速入门

    官网地址(https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html)而且是中文的 Elastic的快速入门 1.基础 ...

  6. ElasticSearch快速入门详解(亲测好用,强烈推荐收藏)

    3.快速入门 接下来快速看下elasticsearch的使用 3.1.概念 Elasticsearch虽然是一种NoSql库,但最终的目的是存储数据.检索数据.因此很多概念与MySQL类似的. ES中 ...

  7. 京东搜索引擎技术-Elasticsearch快速入门

    一.简介 Elasticsearch是一个基于Lucence的搜索服务器.它提供了一个分布式的搜索引擎,基于restful web接口.广泛应用于云计算中,能够实时搜索,具有稳定,可靠,快速的特点. ...

  8. ElasticSearch快速入门实战

    一.ElasticSearch简介 1.简介 创始人是Shay Banon(谢巴农),它是java开发,是凯源的企业级搜索引擎,能够实现实时搜索,特点是稳定.可靠.快速,并且安装使用方便.(内置JDK ...

  9. Elasticsearch 快速入门

    安装 在安装 Elasticsearch 之前,请确保你的计算机已经安装了 Java.目前 Elasticsearch 的最新版是 5.2,需要安装 Java 8,如果你用的是老版本的 Elastic ...

  10. ElasticSearch快速入门二(Restful介绍)

    本节课从三个方便讲解 什么是restful ? API: Application Programming Interface的缩写,中文意思就是应用程序接口. ●XML: . 可扩展标记语言,是一种程 ...

最新文章

  1. 操作系统学习1:操作系统概述
  2. 超过efficientnet
  3. linux数组shell数组添加内容,shell数组的定义与应用
  4. 5.4 加权最小二乘法
  5. [C#学习] DataAdapter.Fill()分页
  6. python京东商品_Python爬取京东的商品分类与链接
  7. js基础之--变量 作用域和内存问题
  8. 千亿级数量下日志分析系统的技术架构选型
  9. 机器学习实践笔记(二)EOF
  10. 如何直观理解拉格朗日乘子法与KKT条件
  11. 使用arcgis、matlab与R语言GD包进行地理探测器 批量运行,并导出探测结果
  12. 【图像增强】基于matlab HSI+同态滤波彩色图像增强【含Matlab源码 1515期】
  13. 推荐几款 Redis 可视化工具
  14. mac os安装Windows系统失败后不能合并为一个分区
  15. Gale-Shapley 稳定匹配算法的C++实现
  16. 《期权、期货及其他衍生产品》读书笔记(第四章:利率)
  17. 2014诺贝尔化学奖(了解学习)
  18. C语言中输出两个数中的较大值(2021.11.12)
  19. oracle rfs进程过多,DATA GUARD的RFS进程的问题
  20. Java实现画图软件(Swing)

热门文章

  1. Android和DLT日志系统
  2. 搜集此类软件(不少于4个),针对其特点,价格(包括免费),适用范围等做出评估。按照你的分析来说明,此软件可能存在的盈利方式以及可能投入的资金,以及,如果你来开发此类软件,你认为应该如何投资或者评估。
  3. 常微分方程数值解的c语言程序,常微分方程的数值解法 一阶常微分方程数值解的C语言编程实现.doc...
  4. Web Atoms Crack,JavaScript 桥接器
  5. 硬件工程师和软件工程师哪个更有前途?
  6. outs.write(baos.toByteArray()) 内存溢出
  7. 虽说是递推式,但我还是觉得是逆推法
  8. 每日一题:由棋盘放麦子引出Java的BigInteger
  9. 1983—2001世嘉主机发展历程
  10. 给你一本武林秘籍,和KeeWiDB一起登顶高性能