原创做者,公众号【程序员读书】,欢迎关注公众号,转载文章请注明出处哦。程序员
在上一篇文章中,讲了Elastic Stack
的组成,对其中的各个组件的功能有了大体的了解,也知道各个组件如何安装,而其中最重要的组件即是elasticsearch(es)
了,因此咱们在这篇文章中,就讲讲es
的一些核心的概念。数据库
es
的核心概念主要是:index
(索引)、Document
(文档)、Clusters
(集群)、Node
(节点)与实例,下面咱们先来了解一下Document
与Index
。编程
在讲解Document
与Index
概念以前,咱们先来了解一下RESTful APIs
,由于下面讲解Document
和Index
的时候会使用到。json
当咱们把es服务器启动起来以后,要怎么调用呢?api
其实很简单,es提供了基于HTTP
协议的RESTful APIS
,也就是说咱们能够经过向es服务器发送HTTP
请求来操做es服务器,如对文档读写、查询文档API、搜索API、索引的建立与删除,es默认使用9200端口接收HTTP请求。bash
因此调用es很简单,咱们甚至可使用命令行工具curl
来调用es
,好比下面的代码中,咱们使用curl
向es
发送PUT
请求,在request body携带JSON格式的数据传给es服务器:服务器
# 使用curl调用es,建立一个文档
curl http://localhost:9200/my_test/1 -H "Content-Type:application/json" \
-X POST -d '{"uid":1,"username":"test"}'
复制代码
下面的图片演示向es发送请求与es服务器响应的过程:网络
不过通常咱们能够经过Kibana来管理es,而Kibana中的Dev Tools
可让咱们更加方便地使用各类es
的RESTful API
,下面是咱们在Kibana
中Dev Tools
使用的语句结构,其实做用与上面使用curl
同样,咱们在下面的演示会使用这种格式。app
PUT /my_test/_doc/1
{
"uid":1,
"username":"test"
}
复制代码
其实,为了方便不一样编程语言的调用,es
提供多种编程语言的类库(Java
,PHP
,Ruby
,Go
,Python
,JavaScript
,NET
等),但这些编程语言是基于es
提供的RESTful APIs
的封装。curl
es
是面向文档的,文档是es
中可搜索的最小单位,es
的文档由一个或多个字段组成,相似于关系型数据库中的一行记录,但es
的文档是以JSON
进行序列化并保存的,每一个JSON
对象由一个或多个字段组成,字段类型能够是布尔,数值,字符串、二进制、日期等数据类型。
es
每一个文档都有惟一的id
,这个id
能够由咱们本身指定,也能够由es
自动生成。
es
每个文档,除了保存咱们写入进行的文档原始数据外,也有文档本身的元数据,这些元数据,用于标识文档的相关信息。
下面是一个普通的es
文档:
{
"_index" : "test_logs2",
"_type" : "_doc",
"_id" : "1",
"_version" : 1,
"_seq_no" : 0,
"_primary_term" : 1,
"found" : true,
"_source" : {
"uid" : 1,
"username" : "test"
}
}
复制代码
从上面的文档中,咱们能够看文档的元数据字段以下:
下面咱们来了解es
经过RESTful Api
提供了文档的CURD
等操做:
经过es的RESTful API
,使用HTTP
的PUT
方法,能够在某个索引中建立一个文档,在Kibana
的Dev Tools
中,咱们可使用下面的语句建立一个文档:
# 在my_test索引中建立一个文档
PUT /my_test/_create/1
{
"uid":1,
"username":"one"
}
复制代码
在es中,索引大概有如下三种含义与做用:
- 动词,es中一种建立文档的方式,就是如今讲到的。
- 名词,es组织文档的方式,下面会讲到。
- 动词,对文档的字段进行分词并存储,之后会讲到
# 使用Index的方式
PUT /my_test/_doc/1
{
"uid":1,
"username":"test"
}
复制代码
Index的方式与Create同样,用于建立一个es文档,不一样的是,使用Index建立文档时,若是指定的文档id已经存在,则会删除原文档,并从新建立一个文档,而且文档的字段
_version
会加1
更新一个文档的数据使用的是HTTP的POST方法,并且修改的字段信息还必须在doc
中,以下:
使用Update的方式是直接更新数据,这点与使用Index建立文档,文档存在时,会删除文档再从新建立是不一样的。
# 更新
POST /my_test/_doc/1
{
"doc":{
"username":"this is a document"
}
}
复制代码
使用HTTP中DELETE方法,能够删除一个es的文档,示例以下:
# 删除文档
DELETE /my_test/_doc/1
复制代码
读取一个es文档就很简单了,使用HTTP的GET方法就能够了,以下:
# 读取
GET /my_test/_doc/1
复制代码
上面的讲的对关于文档的Index
,Create
,Update
,Delete
等操做,但每一次只能对一个索引的一个文档进行操做,而咱们知道每一次请求服务器进行操做时,网络请求往返时间的开销是一个很大的消耗,若是每一个请求都只作一个操做,那么就有点太浪费了。
因此es
的文档的bulk api
支持在一次请求中同时对不一样索引中的文档进行Index
,Create
,Update
,Delete
等操做,也就是所谓的批量处理,在处理过程,即使其中某个操做出错,也不会影响其余操做,以下:
POST _bulk
{"create":{"_index":"my_test2","_id":4}}
{"uid":2,"username":"333333333333333333"}
{"index":{"_index":"my_test2","_id":10}}
{"uid":10,"username":"tttt"}
{"delete":{"_index":"my_test2","_id":1}}
{"update":{"_index":"my_test2","_id":2}}
{"doc":{"uid":2,"username":"hhhhhhhhhhhhhhhhh"}}
复制代码
上面只是bulk api
的简单示例,若是要熟悉语法,仍是要多看看es
的官方文档。
es
索引,是es
组织文档的方式,是拥有相结构文档的集合,能够把es
的索引类比为关系型数据库的一张数据表。
下面咱们来看看对索引的各类操做的RESTful APIs
,以下:
使用HTTP
的PUT
方法即可以建立一个索引,在Kibna
的Dev Tools
,使用下面的语句即可建立一个索引:
PUT /my_test
复制代码
在建立索引时也指定mapping和setting,以下:
PUT /my_test
{
"settings" : {
"index" : {
"number_of_shards" : 3,
"number_of_replicas" : 2
}
}
}
复制代码
可使用HTTP
的HEAD
方法判断索引是否存在,以下:
# 判断索引是否存在
HEAD /my_test
复制代码
若是索引存在,则http
状态码返回200
,若是不存在,则返回404
。
使用HTTP
的GET
方法能够获取索引的setting
和mapping
等信息,以下:
GET /index
复制代码
返回以下的结果:
{
"my_test" : {
"aliases" : { },
"mappings" : { },
"settings" : {
"index" : {
"creation_date" : "1564757617415",
"number_of_shards" : "1",
"number_of_replicas" : "1",
"uuid" : "z6zGhu_ERA-R1c0m2fQrvg",
"version" : {
"created" : "7020099"
},
"provided_name" : "my_test"
}
}
}
}
复制代码
es中删除的索引API,容许咱们删除已经存在的索引,有如下几种状况:
# 删除my_test
DELETE /my_test
# 删除多个索引,用逗号分隔
DELETE /my_test,my_test1,my_test2
复制代码
# 删除以my_test为前缀的索引
DELETE /my_test*
复制代码
# 删除所有索引
DELETE /_all
复制代码
注意,这种操做很是危险,不推荐使用,若是想禁用这种操做,可在在es
的config/elasticsearch.yml
中将参数action.destructive_requires_name
设置为true
,如:
action.destructive_requires_name:true
复制代码
这样的话,则不能执行以上的操做了。
文档和索引是es
中最基础也是最核心的概念,熟悉对掌握文档和索引的操做是进一步学习es
的基础,其实,若是你有关系型数据库的知识,能够把索引类比为数据库中的数据表,而文档能够理解为数据表中的一行记录。
你的关注,是我写做路上最大的鼓励!