ElasticSearch創建文檔

本部落格中使用的 ElasticSearch 均是 7.9+ 版本

1. 新建文檔

  • 支援自動生成文檔 ID 和指定文檔 ID 兩種方式
  • 通過調用 「post/users/_doc」 ,系統會自動生成 document id
  • 使 用HTTP PUT /usr/_create/1 創建時,URL中顯示指定 _create ,此時如果改 ID 的文檔已經存在,操作失敗

新建一個索引,然後向索引中添加一個文檔

1.1 使用kibana創建

PUT blog/_doc/1   # 1 表示新建文檔的 id
{
  "title":"雪中悍刀行",
  "date":"2020-11-05",
  "content":"關於廟堂權爭與刀劍交錯的江湖"
}

添加成功後,響應的 json 如下

{
  "_index" : "blog",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 2,
    "failed" : 0
  },
  "_seq_no" : 0,
  "_primary_term" : 1
}
  • _index 表示文檔索引。
  • _type 表示文檔的類型。
  • _id 表示文檔的 id。
  • _version 表示文檔的版本(更新文檔,版本會自動加 1,針對一個文檔的)。
  • result 表示執行結果。
  • _shards 表示分片資訊。
  • _seq_no_primary_term 這兩個也是版本控制用的(針對當前 index)

當然,添加文檔時,也可以不指定 id,此時系統會默認給出一個 id,如果不指定 id,則需要使用 POST 請求,而不能使用 PUT 請求。

POST blog/_doc
{
  "title":"劍來",
  "date":"2020-11-05",
  "content":"烽火戲諸侯作品"
}


curl -H "Content-Type: application/json" -XPOST //master:9200/test/_doc -d \
'{
    "name": "qiaofeng",
    "age": 28
    
}'

curl -H "Content-Type: application/json" -XPOST //master:9200/test/_doc -d \
'{
    "name": "xuzhu",
    "age": 22
}'

curl -H "Content-Type: application/json" -XPOST //master:9200/test/_doc -d \
'{
    "name": "duanyu",
    "age": 20
}'

系統自動生成ID的不能使用 PUT 請求,因為會報錯

{
  "error" : "Incorrect HTTP method for uri [/blog/_doc?pretty=true] and method [PUT], allowed: [POST]",
  "status" : 405
}

1.2 使用 curl 命令創建

創建文檔,指定Id,如果id已經存在,報錯:

curl -H "Content-Type:application/json" -XPUT '//10.135.73.73:9201/index_name/_doc/1?pretty' -d \
'{ 
    "name": "xuwl", 
    "age": 18, 
    "job": "Linux" 
 }'
命令介紹:
-H:指定內容類型
-X:指定http請求方式,這裡為PUT上傳方式
//10.135.73.73:9201:指定一台es伺服器對外的http埠
/index_name:文檔的索引名稱,必須小寫
/type_name:文檔的類型名稱,7.0開始一個索引只能創建一個Type ,即,「_doc」
/1:文檔的ID編號
?pretty:人性化創建索引
-d:指定使用JSON方式來撰寫上傳文檔
{ "name": "xuwl", "age": 18, "job": "Linux" }':使用JSON格式來撰寫上傳文檔內容

索引初始化,創建索引之前可以對索引做初始化操作,比如指定shards數量以及replicas的數量

curl -XPUT '//master:9200/test/' -d \
'{
    "settings":{
        "index":{
            "number_of_shards":5
            "number_of_replicas":1
        }
    }
}'

適當的提升分片數量可以提升建立索引的速度;

一般情況下:一個索引庫建立5-20個分片是最合適的;

注意:如果分片過少或者過多,都會降低檢索的速度

分片數過多會導致:

  • 會導致打開比較多的文件

  • 分片是存儲在不同機器上的,分片數越多,機器之間的交互也就越多;

分片數太少導致:

  • 單個分片索引過大,降低整體的檢索速率

建議:

  • 將單個分片存儲存儲索引數據的大小控制在20G左右;絕對不要超過50G , 否則性能很差

最終分片數量 = 數據總量/20G

查看索引

curl -XGET '//10.135.73.73:9201/_cat/indices?v'

查看分片

可以看到我們分片存儲的對應的地址,沒有出現我們的master節點地址,也沒有出現我們的client節點,僅僅只有我們所設置的數據存儲節點,
額,下面還有10.150.55.95是我們的master節點的原因,是因為我把node.data設置為了true….. 我錯了,
大家要相信我,只要把node.data設置為false它肯定是不會存儲數據的。。。

curl -XGET '//10.135.73.73:9201/_cat/shards?v'

PUT和POST的用法區別

  • PUT, DELETE操作是冪等的。 所謂冪等是指不管進行多少次操作,結果都一樣。 比如我用PUT修改一篇文章, 然後在做同樣的操作,每次操作後的結果並沒有不同, DELETE也是一樣。

  • POST操作不是冪等的, 比如常見的POST重複載入問題: 當我們多次發出同樣的POST請求後, 其結果是創建出了若干的資源。

  • 還有一點需要注意的就是, 創建操作可以使用POST, 也可以使用PUT, 區別在於POST是作用在一個集合資源之上的(/articles) ,而PUT操作是作用在一個具體資源之上的(/articles/123) , 比如說很多資源使用資料庫自增主鍵作為標識資訊, 而創建的資源的標識資訊到底是什麼只能由服務端提供, 這個時候就必須使用POST。

創建全新內容的兩種方式:

  1. 使用自增ID(POST)
curl -H "Content-Type: application/json" -XPOST //master:9200/test/user/ -d \
'{
    "name" : "xiaoyaozi"
    
}'
  1. 在url後面添加參數
curl -H "Content-Type: application/json" -XPUT //10.135.73.73:9201/test/user/2?op_type=create -d \
'{
    "name":"lucy",
    "age":18
 }'
curl -H "Content-Type: application/json" -XPUT //10.135.73.73:9201/test/user/3/_create -d \
'{
    "name":"lily",
    "age":28
 }'
Tags: