Elasticsearch核心基礎概念:文檔與索引

原創做者,公衆號【程序員讀書】,歡迎關注公衆號,轉載文章請註明出處哦。程序員

在上一篇文章中,講了Elastic Stack的組成,對其中的各個組件的功能有了大體的瞭解,也知道各個組件如何安裝,而其中最重要的組件即是elasticsearch(es)了,因此咱們在這篇文章中,就講講es的一些核心的概念。數據庫

es的核心概念主要是:index(索引)、Document(文檔)、Clusters(集羣)、Node(節點)與實例,下面咱們先來了解一下DocumentIndex編程

RESTful APIs

在講解DocumentIndex概念以前,咱們先來了解一下RESTful APIs,由於下面講解DocumentIndex的時候會使用到。json

當咱們把es服務器啓動起來以後,要怎麼調用呢?api

其實很簡單,es提供了基於HTTP協議的RESTful APIS,也就是說咱們能夠經過向es服務器發送HTTP請求來操做es服務器,如對文檔讀寫、查詢文檔API、搜索API、索引的建立與刪除,es默認使用9200端口接收HTTP請求。bash

因此調用es很簡單,咱們甚至可使用命令行工具curl來調用es,好比下面的代碼中,咱們使用curles發送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可讓咱們更加方便地使用各類esRESTful API,下面是咱們在KibanaDev Tools使用的語句結構,其實做用與上面使用curl同樣,咱們在下面的演示會使用這種格式。app

PUT /my_test/_doc/1
{
    "uid":1,
    "username":"test"
}
複製代碼

其實,爲了方便不一樣編程語言的調用,es提供多種編程語言的類庫(Java,PHP,Ruby,Go,Python,JavaScript,NET等),但這些編程語言是基於es提供的RESTful APIs的封裝。curl

文檔(Document)

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"
  }
}
複製代碼

從上面的文檔中,咱們能夠看文檔的元數據字段以下:

  • _index:文檔所在索引名稱
  • _source:原始json數據
  • _type:文檔所屬類型,es7.0之後只有爲 _doc
  • _version:文檔版本,若是對文檔進行修改,則該字段會增長
  • _score:相關性打分
  • id:文檔惟一id

下面咱們來了解es經過RESTful Api提供了文檔的CURD等操做:

Create

經過es的RESTful API,使用HTTPPUT方法,能夠在某個索引中建立一個文檔,在KibanaDev Tools中,咱們可使用下面的語句建立一個文檔:

# 在my_test索引中建立一個文檔
PUT /my_test/_create/1
{
    "uid":1,
    "username":"one"
}
複製代碼

Index

在es中,索引大概有如下三種含義與做用:

  1. 動詞,es中一種建立文檔的方式,就是如今講到的。
  2. 名詞,es組織文檔的方式,下面會講到。
  3. 動詞,對文檔的字段進行分詞並存儲,之後會講到
# 使用Index的方式
PUT /my_test/_doc/1
{
    "uid":1,
    "username":"test"
}
複製代碼

Index的方式與Create同樣,用於建立一個es文檔,不一樣的是,使用Index建立文檔時,若是指定的文檔id已經存在,則會刪除原文檔,並從新建立一個文檔,而且文檔的字段_version會加1

Update

更新一個文檔的數據使用的是HTTP的POST方法,並且修改的字段信息還必須在doc中,以下:

使用Update的方式是直接更新數據,這點與使用Index建立文檔,文檔存在時,會刪除文檔再從新建立是不一樣的。

# 更新
POST /my_test/_doc/1
{
    "doc":{
        "username":"this is a document"
    }
}
複製代碼

Delete

使用HTTP中DELETE方法,能夠刪除一個es的文檔,示例以下:

# 刪除文檔
DELETE /my_test/_doc/1
複製代碼

Read

讀取一個es文檔就很簡單了,使用HTTP的GET方法就能夠了,以下:

# 讀取
GET /my_test/_doc/1
複製代碼

Bulk Api

上面的講的對關於文檔的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的官方文檔。

索引(Index)

es索引,是es組織文檔的方式,是擁有相結構文檔的集合,能夠把es的索引類比爲關係型數據庫的一張數據表。

下面咱們來看看對索引的各類操做的RESTful APIs,以下:

Create

使用HTTPPUT方法即可以建立一個索引,在KibnaDev Tools,使用下面的語句即可建立一個索引:

PUT /my_test
複製代碼

在建立索引時也指定mapping和setting,以下:

PUT /my_test
{
    "settings" : {
        "index" : {
            "number_of_shards" : 3, 
            "number_of_replicas" : 2 
        }
    }
}
複製代碼

Exists

可使用HTTPHEAD方法判斷索引是否存在,以下:

# 判斷索引是否存在
HEAD /my_test
複製代碼

若是索引存在,則http狀態碼返回200,若是不存在,則返回404

Get

使用HTTPGET方法能夠獲取索引的settingmapping等信息,以下:

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"
      }
    }
  }
}

複製代碼

Delete

es中刪除的索引API,容許咱們刪除已經存在的索引,有如下幾種狀況:

使用索引名,刪除單個或多個索引
# 刪除my_test
DELETE /my_test

# 刪除多個索引,用逗號分隔
DELETE /my_test,my_test1,my_test2
複製代碼
使用通配符*刪除多個索引(慎用)
# 刪除以my_test爲前綴的索引
DELETE /my_test*
複製代碼
使用_all刪除es服務器上的所有索引
# 刪除所有索引
DELETE /_all
複製代碼

注意,這種操做很是危險,不推薦使用,若是想禁用這種操做,可在在esconfig/elasticsearch.yml中將參數action.destructive_requires_name設置爲true,如:

action.destructive_requires_name:true
複製代碼

這樣的話,則不能執行以上的操做了。

小結

文檔和索引是es中最基礎也是最核心的概念,熟悉對掌握文檔和索引的操做是進一步學習es的基礎,其實,若是你有關係型數據庫的知識,能夠把索引類比爲數據庫中的數據表,而文檔能夠理解爲數據表中的一行記錄。


你的關注,是我寫做路上最大的鼓勵!

相關文章
相關標籤/搜索