本文已参与「新人创作礼」活动,一起开启掘金创作之路。
写在前面
通过之前的几篇安装指南,我们已经把Elasticsearch的集群搭建起来了,并且也使用了Kibana进行交互式的操作。在操作中,我们发现Elasticsearch提供了基于RESTFUL风格的API操作。今天我们就送RESTful入手,介绍Elasticsearch中的索引(index)和文档(document)究竟是什么样的。为了简便沟通,我们在这里达成共识,除非特别说明,我们所说的es
便是Elasticsearch
。
RESTful
REST是Representational State Transfer的缩写,RESTful的架构设计,被定义成HTTP协议的最佳实践,因此我们可以知道,RESTful是一种风格,风格是为了让软件更加清晰,易于维护和使用。
我们知道HTTP支持不同的请求方法,例如GET、POST等等,因此也对应了不同的操作,具体的定义示例可看下图。
关于RESTful风格在学习es了解这么多已经足够了,更详细的信息,我们将在《RESTfullAPI操作篇》
详细介绍。
文档 (Document)
众所周知,es是一个分布式文档存储。es在数据处理上,并不会把数据处理成为像是MySQL数据库的表格形式,而是将数据序列化成为JSON文档,这样能够存储更加复杂的数据结构。而这样一个JSON对象,es称之为文档Document
。同时,JSON对象是有一个或者多个字段组成,这些字段也有着不同的类型,例如字符串、数值、日期、地理信息等。
定义
现在,我们知道,文档是es一个JSON对象,JSON对象中包含不同的字段,描述着对象的属性。那么如何定义一个对象呢?我们从Kibana的Dev Tools进行操作。
# 在es-learn-doc-person索引中创建一个文档
PUT /es-learn-doc-person/_create/1
{
"name":"zhang san",
"age":29
}
复制代码
此时,这个name
叫做zhang san的对象,被{}
包围起来的,就是es里的一个文档。
执行,返回信息
{
"_index" : "es-learn-doc-person",
"_id" : "1",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 2,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1
}
复制代码
我们来分别解读一下创建指令和返回的信息。
PUT /es-learn-doc-person/_create/1
可以解读为
PUT 请求方式,一般用在创建的场景下,POST也可以
es-learn-doc-person {索引名称},POST请求下,如果这个索引不存在,会自动创建索引
_create 是es提供的操作api,此处需要注意,一般而言es的api都是以下划线_开头的
1 代表的是这个文档id
复制代码
所以这段命令执行的意思就是,向索引es-learn-doc-person中创建一个文档,这个文档的属性用JSON串来表示。
通过创建文档指令的返回信息,我们能够分析文档的元数据有哪些。
_index
:文档归属的索引是哪一个,索引可以理解为一系列文档的集合
_id
:文档的id,如果不指定的话,es会赋值
_version
: 版本,用来记录修改的版本次数,递增
_shard
:分片信息,集群篇我们详细介绍
result
:指令执行的结果,一般有created创建成功,updated更新成功
CRUD
既然我们知道了,文档是什么,也知道了可以通过RESTful API的方式来操作文档,接下来我们尝试着,在索引中对我们常见的CRUD进行操作。首先,我们先看下,不同的操作请求对应的不同的
操作 | 请求方式 | 备注 |
---|---|---|
创建 | PUT | PUT创建已存在的情况,会报错 也可以用POST,如果存在会更新,不存在会创建 |
更新 | POST | 更新,如果不存在则会创建 |
查找 | GET | |
删除 | DELETE |
增
# 在索引es-learn-doc-person中创建一个文档id为10,name为ma zi,年龄20岁
PUT /es-learn-doc-person/_create/10
{
"name":"ma zi",
"age":20
}
复制代码
查
# 查出es-learn-doc-person中name是 zhang san的文档
GET /es-learn-doc-person/_search
{
"query": {
"match": {
"name": "zhang san"
}
}
}
复制代码
改
# 在索引es-learn-doc-person中id=10的年龄改为30
POST /es-learn-doc-person/_doc/10
{
"age":30
}
复制代码
删
# 删除索引es-learn-doc-person中id=10的文档
DELETE /es-learn-doc-person/_doc/10
复制代码
索引 (Index)
在上面的创建文档的时候
# 在es-learn-doc-person索引中创建一个文档
PUT /es-learn-doc-person/_create/1
{
"name":"zhang san",
"age":29
}
复制代码
我们指定了索引es-learn-doc-person
,默认es帮我们创建了索引。
# 我们无条件查询下索引
GET /es-learn-doc-person/_search
复制代码
通过结果,我们可以看到,这个索引下包含了很多的文档,并且会有相关的一些维度信息,因此索引可以看做是文档集合和相关的文档处理。
元数据
对于索引的元数据,es有两部分的划分,setting
,mapping
。可以通过es相关api来查看。
setting
setting主要用来限定索引的一些行为,首先我们先查看,我们默认创建的索引的setting有哪些信息。
GET /es-learn-doc-person/_settings
复制代码
返回信息
index.routing.allocation.include._tier_preference
:在索引创建分配的时候推荐分配到哪些节点。
number_of_shards
: 分区个数,将索引的数据分成多少份存储
number_of_replicas
: 副本个数
一般我们比较关心的是索引的分区个数和副本个数,但是在其他的部分也有相关的设置,例如怎么确定分词、怎么进行索引分块、怎么进行分区合并、怎么记录慢日志等等。
mapping
mapping是用来定义文档对象的属性,可以类比到表的列字段。
# 查询索引的映射
GET /es-learn-doc-person/_mapping
复制代码
问题
- 在之前的es版本,文档的还有一个元数据_type?你知道是做什么的吗?为什么后期的版本进行了取消?