一、基本概念
1)、 索引(index)
在ES中索引类似于MySql中的库的概念(暂时这么理解),我们可以创建一个用户的索引,一个商品的索引,也可以创建一个会员的索引(索引的名称必须是小写字母),所有的数据都是基于索引开始的。
2)、类型(type)
在ES中,类型是索引下面的数据分类,可以跟我我们的业务需求进行分裂,比如我们创建了一个学校的索引,可以再定义类型的时候定义来事类型,学生类型,学校领导类型,相当于musql中的表概念(在ES6.x版本以前是这样的,官方好像也不推荐这么去使用,容易出现查询的BUG,目前在理论学习阶段可以这么去理解,会降低学习难度)。
3)、文档(documnet)
1、存储在ES中的主要实体叫做文档, 用关系型数据来类比的话,一个文档相当于数据库中的一行记录;
2、ES和MongoDB中的文档类型,都可以有不同的结构,但是在ES中的文档中,相同字段必须有相同类型;
3、文档由多个字组成,每个字段可能多次出现在一个文档里,这样的字段叫做多值字段;
4、每个字段的类型,可以是文本,数值,日期等,字段类型也可以是复杂类型,一个字段包括其他字文档或者数组文档中的数据都是以json的行驶进行存储的;
ES5 版本和ES6版本的变化
在5.x版本以前可以再一个索引中定义多个类型,6.x之后的版本也是可以使用和兼容5.x版本,但是不推荐,在7.x版本以后彻底的移除一个索引创建多个类型
为什么要移除类型呢?
官方文档解释说,在5版本前,用ES和关系型数据进行比较是一个错误的比较,因为在mysql中表和表中的字段是有关联关系的,但是在ES中并非如此,也就是说在ES中不同映射类型中具有相同字段的名称字段会有问题
映射
所有文档写进索引之前都会先进行分析,如何将输入的文本分割为词条,那些词条又会被过滤,这种行为叫做映射,一般由用户自己定义规则,类似musql中创建表时对字段进行的约束,例如:表中有那些字段,字段是什么类型,长度是多少
文档类型
在ES中,一个索引对象可以存储很多不同用户的对象,例如一个博客程序可以保存文章和评论;
每个文档可以有不同的结构;
不同的文档类型不能为相同的属性设置不同的类型,例如在同一个索引中的所有文档类型中,一个叫title的字段必须具有小滚筒的类型
个人简单总结
以上是ES的基本概念,如果理解了这些概念在设计缓存结构会为我们提供一些思路;
首先是索引,然后才是类型,类型中才有一条条数据也就是文本;
映射类似于我们在mysql中写的建表语句,在创建索引的时候就设置好字段、类型、长度等
ElasticSearch文件的存储过程:
ES是一个近乎实时的搜索引擎,他不是实时的搜索引擎,数据存储过程如下:
1、首先数据写入缓存区和Translog日志文件中,当你添加一条文档的时候,一方面写入到内存缓冲区中,一方面同时吸入到Translog日志文件中;
2、内存缓存区满了或者每隔1秒(默认1秒),refresh将内存缓存区的数据生成index,segment文件并写入文件系统缓存区,此时index segment可以提供search查询读取,这样文本就可以被搜索到了(此时文档还没有写到磁盘上),然后清空内存缓存区,供后续使用,可见,refresh实现的是文档从内存缓存区移动到文件系统缓存区的过程;
3、重复上两个步骤,新的segment不断添加到文件系统的缓存区,内存缓存区不断被清空,而translog的数据不断增加,随着时间的推移translog文件会越来越大;
4、当Translog长度达到一定程度的时候,会触发flush操作,否则默认每隔30分钟也会定时flush,主要过程为:
4.1:执行refresh操作将内存缓冲区中的数据写入到新的segment并写入文件系统缓存区,然后打开本segment以供search使用,最有再次清空内存缓存区。
4.2:一个commitpoint被写入磁盘,这个commit point中标明所有的index segment;
4.3: 文件系统中换粗你的所有index segment文件被fsync强制刷到磁盘,当index segment被fsync强制刷到磁盘上以后就会被打开,供查询使用;
4.4: tarnslog被清空和删除,创建一个新的translog