摘要:本文从使用角度介绍Elasticsearch的数据模型,而不是分析Elasticsearch底层的存储结构,教程的目的是帮助大家快速上手ES,我们要使用ES得先...
本文从使用角度介绍Elasticsearch的数据模型,而不是分析Elasticsearch底层的存储结构,教程的目的是帮助大家快速上手ES,我们要使用ES得先知道ES是怎么存储数据的,结构是怎么样的。
我们都知道MYSQL的数据模型由数据库、表、字段、字段类型组成,自然ES也有自己的一套存储结构,下面先介绍ES存储相关的概念,然后跟MYSQL做一下对比方便大家理解。
MYSQL 是关系数据库,Elasticsearch是NOSQL类型的数据库,虽然他们都是数据库,但是他们定位不一样,也不是同一类型的数据库,拿来做对比,是因为一方面大家对MYSQL比较熟悉,另外从使用角度ES的存储结构跟MYSQL比较相似。
1. 基本概念
1.1. index(索引)
在Elasticsearch中索引(index)类似mysql的表,代表文档数据的集合,文档指的是ES中存储的一条数据。
1.2. type(文档类型)
在新版的Elasticsearch中,已经不使用文档类型了,在Elasticsearch老的版本中文档类型,代表一类文档的集合,index(索引)类似mysql的数据库、文档类型类似Mysql的表。
既然新的版本文档类型没什么作用了,那么index(索引)就类似mysql的表的概念,ES没有数据库的概念了。
提示:在Elasticsearch7.0以后的版本,已经废弃文档类型了,如果大家不是接手老的项目,可以不必理会文档类型,可以直接将index(索引)类比Mysql的表。
1.3. Document(文档)
Elasticsearch是面向文档的数据库,文档是最基本的存储单元,文档类似mysql表中的一行数据。
简单的说在ES中,文档指的就是一条JSON数据。
Elasticsearch中文档使用json格式存储,因此存储上比Mysql要灵活的多,Elasticsearch支持任意格式的json数据。
例如:
一个订单数据,我们可以将复杂的Json结构保存到Elasticsearch中, mysql的就无法这样存储数据。
{ "id": 12, "status": 1, "total_price": 100, "create_time": "2019-12-12 12:20:22", "user" : { // 嵌套json对象 "id" : 11, "username": "yzmcms", "phone": "18801108888", "address" : "北京市海淀区" } }
文档中的任何json字段都可以作为查询条件。
文档的json格式没有严格限制,可以随意增加、减少字段,甚至每一个文档的格式都不一样也可以。
在同一个索引存中,存储格式完全不一样的文档数据,举个例子:
{"id":1, "username":"yzmcms"} {"id":1, "title":"yzmcms内容管理系统", "tag":"开源cms"} {"domain":"www.yzmcms.com", "https": true}
虽然文档的格式没有限制,可以随便存储任意格式数据,但是,实际业务中不会这么干,通常一个索引只会存储格式相同的数据,例如:订单索引,只会保存订单数据,不会保存商品数据,否则你会被自己搞死,自己都不知道里面存的是什么数据。
1.4. Field(文档字段)
文档由多个json字段(Field)组成, 这里的字段类似mysql中表的字段。
当然Elasticsearch中字段也有类型的,下面是常用的字段类型:
数值类型(包括: long、integer、short、byte、double、float)
text - 支持全文搜索
keyword - 不支持全文搜索,例如:email、电话这些数据,作为一个整体进行匹配就可以,不需要分词处理。
date - 日期类型
boolean 后面的章节会专门介绍字段类型,Elasticsearch支持的字段类型远比这里介绍的多。
提示:Elasticsearch支持动态映射,我们可以不必预先定义文档的json结构和对应的字段类型,Elasticsearch会自动推断字段的类型。
1.5. mapping (映射)
Elasticsearch的mapping (映射)类似mysql中的表结构定义,每个索引都有一个映射规则,我们可以通过定义索引的映射规则,提前定义好文档的json结构和字段类型,如果没有定义索引的映射规则,Elasticsearch会在写入数据的时候,根据我们写入的数据字段推测出对应的字段类型,相当于自动定义索引的映射规则。
提示:虽然Elasticsearch的自动映射功能很方便,但是实际业务中,对于关键的字段类型,通常预先定义好,避免Elasticsearch自动生成的字段类型不是你想要的类型,例如: ES默认将字符串类型数据自动定义为text类型,但是关于手机号,我们希望是keyword类型,这个时候就需要通过mapping预先定义号对应的字段类型了。
2. 类比MYSQL存储结构
Elasticsearch存储结构 --- MYSQL存储结构 index(索引) ----- 表 文档 ---- 一行数据 Field(字段) ---- 表字段 mapping (映射) ---- 表结构定义