原創做者,公衆號【程序員讀書】,歡迎關注公衆號,轉載文章請註明出處哦。程序員
在上一篇文章中,講了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
的基礎,其實,若是你有關係型數據庫的知識,能夠把索引類比爲數據庫中的數據表,而文檔能夠理解爲數據表中的一行記錄。
你的關注,是我寫做路上最大的鼓勵!