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中会建立这样的索引:
Term | Posting List |
张三 | [1,2] |
李四 | [3,4] |
王五 | 5 |
Term | Posting List |
吃饭 | [2,4] |
喝水 | [1,3] |
运动 | 5 |
Term | Posting 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倍