Elasticsearch入门介绍

1.什么是Elasticsearch

Elasticsearch是一个基于Lucene的分布式搜索引擎,它提供分布式的实时文件存储和搜索,可扩展性好,并且支持通过HTTP网络接口交互,数据以JSON格式展示。

2.为什么要用Elasticsearch

这里就不得不提到MySQL了,作为目前最常用的关系型数据库之一,MySQL基本可以满足所有我们对数据存储的要求,但是当数据量特别大的情况下,查询效率就会大大降低,这时候肯定有人说:加索引呀,让查询走索引来提高查询效率;确实,加索引能极大提高查询效率,但是索引加的多了也会影响数据的增删改的效率,那就得不偿失了,特别是像模糊查询的情况使用LIKE就不用说了会触发全表扫描而且不会走索引。

MySql5.6版本中InnoDB引擎支持了FULLTEXT索引,可以通过MATCH({加索引的字段名})…AGAINST('{模糊查询值}')语法进行模糊查询;

举例:从test表中的description字段中匹配有‘fire’单词的数据

select * from test where MATCH(description) AGAINST('fire');

通过FULLTEXT索引来进行模糊查询比LIKE速度快很多,但是也存在着精度问题,不区分大小写,并且查询速度也会被数据量影响。

但是,Elasticsearch最大的优点就是快,即使数据量很大也能很快响应;并且Elasticsearch具有多种分词器,比MySQL模糊查询的精度高很多,也更加灵活。

3.Elasticsearch中部分名词解释

Index(索引):和MySQL里的索引不一样,这里的索引是文档存储的地方,相当于MySQL里的Database的概念

Type(类型):在Index中区分数据的,相当于MySQL中table的概念,在7.*以后的版本就已经不推荐使用了

Document(文档):相当于MySQL中row的概念,也就是一行记录,新增一个文档在MySQL中就相当于新增一条记录,在Elasticsearch中会以JSON格式存储,每个文档都必须有一个唯一的ID,如果自己不指定,系统也会自动生成

Term(单词):文本经过分词器分成的一个个单词,区分大小写

Term Dictionary(单词字典):单词的集合

Term Index(单词索引):为了在单词字典中快速定位单词,给单词建立索引

Posting List(倒排表):简单理解就是文档id集合,还记录了单词在所有文档中的出现次数和偏移位置

4.ELasticsearch为什么这么快(倒排索引)

这跟Elasticsearch的索引方式有关,Elasticsearch使用的是倒排索引,什么是倒排索引呢,简单来说就是通过关键字来定位文档;

举例:

 这样一张表在Elasticsearch中会建立这样的索引:

TermPosting List
张三[1,2]
李四[3,4]
王五5
TermPosting List
吃饭[2,4]
喝水[1,3]
运动5
TermPosting List
上海[1,4]
北京[2,3]
西安5

这样子我们通过关键字就可以快速找到包含这个关键字的文档id了,通过文档id就能快速定位到文档;

但是如果数据量很大的话,Term的量也会很大,这时候在Term Dictionary中找Term就会很慢,为此ELasticsearch为Term建立了索引,就是Term Index;Elasticsearch比MySQL速度快也有这个的原因,因为MySQL的索引文件是存储在磁盘里面的,而Elasticsearch的Term Index是存储在内存中的,索引查找速度得到提升;

 Term Index结构:使用Trie Tree(字典树)结构,也叫前缀树,通过前缀在内存中找到Term在Term Dictionary中block的位置,再去磁盘上找Term,来减少磁盘随机读的次数; 

需要注意的是:Term Index的树结构中并没有存入所有完整的Term,存的是Term的一些前缀和Term Dictionary的block之间的映射关系;这样可以极大减小Term Index的尺寸从而避免占用内存的太大空间;

用一张网上流传的一张图来看这个流程:

5.Elasticsearch的分片机制

这里的分片是物理概念,我们知道Elasticsearch是基于Lucene实现的,Lucene是一个使用Java写的全文检索工具包,而一个分片就是一个Lucene实例;

1.索引和分片的关系

一个索引中的数据会由多个分片平分,查询数据的时候也是在多个分片上查找数据,然后将这些分片上查找到的数据整合起来;例如:一个索引有100M记录,现在这个索引有4个分片,那么每个分片上就会分到25M记录;

2.分片副本

因为Elasticsearch通常为集群,为了避免某台机器出问题导致数据丢失,可以使用副本来保证数据的完整性,这个副本指的是分片的备份,也叫从分片,当某一个主分片出现问题的时候,这个分片的副本就会顶上去来充当主分片

3.分片的数量

分片数量是比较重要的,因为建立索引以后就不能重新分分片数量了,而分片数量过多过少都会有影响

分片数量过多:占用过多内存,影响缓存,影响update的性能

分片数量过少:单个分片数据量太大时影响性能

推荐:分片物理空间大小不超过50G,分片数量为节点数量的1.5到3倍

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值