Elasticsearch(简称 ES,下同) 有几个重要的概念,初学的人不是很好理解,所以为了更快理解和掌握 ES 的重要概念,我们将 ES 和关系型数据库作下类比。
1. 重要概念对比
ES 的几个重要概念是:Index(索引)、Type(类型)、Mapping(索引定义)、Document(文档)、Field(字段)、DSL(查询等语句)。
关系型数据库类似的重要概念是:Table(表)、Schema(结构、定义)、 Row(数据行)、Column(数据列)、SQL(查询等语句)。
按照类比将 ES 和关系型数据库各重要概念具体对应关系如下表所示:
RDBMS | ES |
Table | Index(Type) |
Row | Document |
Column | Field |
Schema | Mapping |
SQL | DSL |
下面通过实例来比较和说明两者的重要概念,帮助我们更加直观的理解这些概念:
比如我们现在来创建一张 student 表,创建过程如下:
创建学生数据库
创建学生信息表(student)
配置 student 表字段,如:姓名 name - vachar 类型、性别 sex - char 类型、年龄 age - int 类型
student 表的每一行表示一个学生信息,不同列表示这个学生不同的属性
使用 ES 创建 student 索引如下:
配置 ES,启动一个 ES 实例(在 ES 中启动一个 ES 实例,这个实例就相当于数据库)
创建学生信息索引(student)
不需要配置字段属性,ES 会自动识别
一个 json 字符串表示一个学生信息,json 字符串中包含学生属性的字段 Field
2. 创建 Index 和 Table 对比
关系型数据表使用 SQL 语句来创建数据表和数据,但需要提前定义好表结构和数据类型:
创建数据表:
CREATE TABLE student(name varchar(20),sex char(5),age int);
创建一条数据:
INSERT INTO student (`name`,`sex`,`age`) VALUES ('gala','male','22');
ES 是基于 http 协议的,所以增删改查的接口都基于 http 协议,因此创建数据时,需要使用 ES 的 Rest API 才能够创建,只需要将 json 格式的学生信息数据利用 Rest API PUT 给 ES 接口创建数据,下面的操作是基于 ES 的可视化界面 Kibana 来操作的,使用 POST 的方式,索引是 student,操作是 _create 创建,这样就能自动创建好索引,并且自动识别各字段的数据类型。
POST student/_create/1{"name":"gala","sex":"male","age":22}
这样就可以轻松创建一个索引(Index)和一条数据了,接下来介绍具体数据的格式。
3. Document 和 Row 对比
关系型数据表,Row 就是一行数据,每行数据是一条记录,查询 SQL 和结果如下:
查询 SQL 语句:
select * from student;
查询结果:

ES 中的数据记录的方式是 Document,数据格式是 json,因此查询返回的结果也是 json:
查询 DSL 语句:
GET student/_search
查询结果:
{"took" : 44,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 1,"relation" : "eq"},"max_score" : 1.0,"hits" : [{"_index" : "student","_type" : "_doc","_id" : "1","_score" : 1.0,"_source" : {"name" : "gala","sex" : "male","age" : 22}}]}}
4. Field 和 Column 对比
关系型数据表每列(Column)代表一个属性,student 表的列数据格式如下:

ES 的字段(Field)类型是自动创建的,比如会给 name 字段自定义为 string 类型,下图是在 Kibana 上创建索引模式之后可以方便看出该类索引的 Field 数据类型:

5. Mapping 和 Schema 对比
关系型数据表的 Schema 说明表之间的关联结构,字段、主外键等关系,但 ES 是没有这么多复杂关系的,不存在主外键,表与表之间的相互联系,ES 是将 json 数据直接存在 ES 中,通过 Mapping 来查看具体数据结构:
查询 DSL 语句:
查询结构:
GET student/_mapping
{"student" : {"mappings" : {"properties" : {"age" : {"type" : "long"},"name" : {"type" : "text","fields" : {"keyword" : {"type" : "keyword","ignore_above" : 256}}},"sex" : {"type" : "text","fields" : {"keyword" : {"type" : "keyword","ignore_above" : 256}}}}}}}
6. DSL 和 SQL 对比
上面的查询用到了 DSL 和 SQL 语句,两者都是一种语法,SQL 针对关系型数据表的,DSL 针对 ES,两者的语法有较大的区别,但应用场景非常相似,比如两者都有“增删改查”等基础功能。在这里不在赘述,后面的学习中会很频繁使用 DSL 语句,届时再详细介绍。




