1. 程式人生 > >Elastic Search 學習入門之ES的簡單操作命令

Elastic Search 學習入門之ES的簡單操作命令

curl是利用URL語法在命令列方式下工作的開原始檔傳輸工具,使用curl可以簡單實現常見的get/post請求。簡單的認為是可以在命令列下面訪問url的一個工具。在centos的預設庫裡面是有curl工具的,如果沒有請yum安裝即可。(以下操作均是基於ElasticSearch6.5.0版本的操作)
    curl:

-X 指定http的請求方法 有 HEAD  GET  POST PUT DELETE

-d 指定要傳輸的資料

-H 指定http請求頭資訊

curl建立索引庫:

 curl -XPUT http://<ip>:9200/index_name/

PUT或POST都可以建立(實驗:6.2之後不可以)

如:

curl -XPOST 'http://hadoop01:9200/book'

舉例:

curl -XPUT 'http://hadoop01:9200/product'

 

  • 建立索引:

    curl -XPOST 'http://hadoop01:9200/product/bigdata/1' -d 

錯誤: {"error":"Content-Type header [application/x-www-form-urlencoded] is not supported","status":406}

curl -H "Content-Type: application/json" -XPOST 'http://hadoop01:9200/product/bigdata/1' -d '{
	"name": "hadoop",
	"author": "apache",
	"version": "3.1.0"
}'

  • PUT和POST的使用者的區別:

    PUT是冪等方法,POST不是。所以PUT使用者更新,POST用於新增比較合適。

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

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

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

  • ES建立索引庫和索引時的注意點

索引庫名稱必須要全部小寫,不能以下劃線開頭,也不能包含逗號

如果沒有明確指定索引資料的ID,那麼ES會自動生成一個隨機的ID,需要使用POST引數

curl -H "Content-Type: application/json" -XPOST 'http://hadoop01:9200/product/bigdata/' -d '{
	"name": "hive",
	"author": "Apache",
	"version": "2.1.0"
}'

如果想要確定建立的都是全新的資料

   1. 使用隨機ID(POST方式)

   2. 在url後面新增引數

curl -H "Content-Type: application/json" -XPOST 'http://hadoop01:9200/product/bigdata/3?op_type=create' -d '{
	"name": "hbase"
}'

或者執行:

curl -H "Content-Type: application/json" -XPOST 'http://hadoop01:9200/product/bigdata/5/_create' -d '{
	"name": "hive"
}'

如果成功建立了新的文件,ES將會返回常見的元資料以及result為created的反饋。如果存在同名檔案,ES將會返回version_conflict_engine_exception和返回一個409COnflict的HTTP反饋碼。

與之前正常的操作對比:

CURL操作(二):高階查詢、更新、刪除與批量操作

  • 查詢:

curl -XGET 'http://<ip>:9200/index/type/doc'

查詢所有:  select * from t;

curl -XGET 'http://hadoop01:9200/product/bigdata/_search'

在任意的查詢url中新增pretty引數,ES可以獲取更易識別的json結果。

格式化查詢結果:

curl -XGET 'http://hadoop01:9200/product/bigdata/_search?pretty'
{
  "took" : 4,
  "timed_out" : false,        ---> 是否超時
  "_shards" : {               ---> 分片個數(一個索引庫有幾個分割槽)
    "total" : 5,              ---> 預設分片有5個
    "successful" : 5,         ---> 能夠正常提供服務的有5個
    "skipped" : 0,            ---> 跳過的分片
    "failed" : 0              ---> (total - successful) = failed
  },
  "hits" : {                  ---> 查詢結果集
    "total" : 3,              ---> 查詢到了幾條記錄
    "max_score" : 1.0,        ---> 記錄中最大的得分
    "hits" : [                ---> 具體的結果集陣列
      {
        "_index" : "product", ---> 結果所在索引庫
        "_type" : "bigdata",  ---> 結果所在索引庫中的某個型別type
        "_id" : "2",          ---> 結果索引id
        "_score" : 1.0,       ---> 索引得分
        "_source" : {         ---> 索引具體內容
          "name" : "hbase"
        }
      },
      {
        "_index" : "product",
        "_type" : "bigdata",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "name" : "hadoop",
          "author" : "apache",
          "version" : "3.1.0"
        }
      },
      {
        "_index" : "product",
        "_type" : "bigdata",
        "_id" : "3",
        "_score" : 1.0,
        "_source" : {
          "name" : "hbase"
        }
      }
    ]
  }
}

查詢指定的索引: select * from t where id = xx

curl -XGET 'http://hadoop01:9200/product/bigdata/1?pretty'

查詢結果只查詢指定欄位source:

curl -XGET 'http://hadoop01:9200/product/bigdata/1/_source?pretty'

查詢索引裡面的包含欄位name以h開頭的所有文件:

curl -XGET 'http://hadoop01:9200/product/bigdata/_search?q=name:h*&pretty'

 查詢索引裡面的包含欄位name=hadoop的所有文件:

curl -XGET 'http://hadoop01:9200/product/bigdata/_search?q=name:hadoop&pretty'

查詢指定欄位的source的指定內容:

curl -XGET 'http://hadoop01:9200/product/bigdata/1/?_source=name,author&pretty'

分頁查詢:

curl -XGET 'http://hadoop01:9200/product/bigdata/_search?pretty&from= 0&size=1'

ES的更新:

ES可以使用PUT或者POST對文件進行更新,如果指定ID的文件已經存在,則執行更新操作

注意:執行更新操作的時候,ES首先將舊的文件標記為刪除狀態,然後新增新的文件,舊的文件不會立即消失,但是也無法訪問,ES會繼續新增更多資料的時候在後臺清理已經標記為刪除狀態的文件。

全域性更新(POST):

curl -H "Content-Type: application/json" -XPOST 'http://hadoop01:9200/product/bigdata/1' -d '{
    "name": "hadoop",
    "author": "Apache",
    "version" : "3.1.0"
}'

全域性更新(PUT):  

curl -H "Content-Type: application/json" -XPUT 'http://hadoop01:9200/product/bigdata/1' -d '{
    "name": "hadoop",
    "author": "Apache",
    "version" : "3.1.0"
}'

區域性更新:可以新增新欄位或者更新已經存在欄位(必須使用POST)

要使用uodate,同時要更新的是source中的doc內容。

curl -XPOST 'http://hadoop01:9200/product/bigdata/1/_update' -d '{
    "doc": {
        "author": "Doug Cutting"
    }
}'

ES的刪除:

普通刪除,根據主鍵刪除:

curl -XDELETE 'http://hadoop01:9200/product/bigdata/3'

說明:如果文件存在,ES屬性result: deleted,_version屬性的值+1。

如果文件不存在,ES屬性result:為not_found,但是版本值依然會+1, 這個就是內部管理的一部分,有點像svn版本號,它保證了我們在多個節點間的不同操作的順序被正確標記了。

注意:一個文件被刪除之後,不會立即生效,它只是被標記為已刪除。ES將會在之後新增更多索引的時候才會在後臺進行刪除。

ES的批量操作——bulk:

Bulk API可以幫助我們同時執行多個請求

格式:

    action: [index|create|update|delete]

    metadata: _index,_type,_id

    request body: _source (刪除操作不需要)

    {action: {metadata}} \n

    {request  body} \n

    {action: {metadata}} \n

    {request  body} \n

create和index的區別:

    如果資料存在,使用create操作失敗,會提示文件已經存在,使用index則可以成功執行。

資料格式:

{"index":{"_id":"1"}}
{"account_number":1,"balance":325,"email":"[email protected]","city":"Brogan","state":"SH"}
{"index":{"_id":"6"}}
{"account_number":6,"balance":566,"email":"[email protected]","city":"Dante","state":"TT"}
curl -H "Content-Type: application/json" -XPOST 'http://<ip>:9200/bank/account/_bulk?pretty' --data-binary "@data/xxx.json"

例如:

 curl -H "Content-Type: application/json" -XPOST 'http://hadoop01:9200/test/accout/_bulk?pretty' --data-binary "@/home/hadoop/data/elasticsearch/test/test.json"

Bulk請求可以在URL中宣告/_index或者/_index/_type

Bulk一次最大處理多少資料量

    Bulk會將要處理的資料載入記憶體中,所以資料量是有限制的

    最佳的資料量不是一個確定的數值,它取決於你的硬體,文件大小以及複雜性,索引以及搜尋的負載

    一般建議是1000~5000個文件,如果你的文件很大,可以適當減少佇列,大小建議是5~15MB,預設不能超過100M,可以在ES的配置檔案中修改這個值: http.max_content_length: 100MB(這是以前的2.3版本的,在6.5版本中沒有找到)

檢視各個索引庫的資訊:

curl 'http://hadoop01:9200/_cat/indices?v'

    

ES的版本控制:

普通關係型資料庫使用的是(悲觀併發控制(PCC))

    當我們在讀取一個數據前先鎖定這一行,然後確保只有讀取到資料的這個執行緒可以修改這一行資料

ES使用的是(樂觀併發控制(OCC))

    ES不會阻止某一資料的訪問,然而,如果基礎資料在我們讀取和寫入的間隔中發生了變化,更新就會失敗,這時候就由程式來決定如何處理這個衝突。它可以重新讀取新資料來進行更新,或者將這一情況直接反饋給使用者。

ES如何實現版本控制(使用ES內部版本號)

    首先得到需要修改的文件,獲取版本號(_version)

curl -XGET 'http://hadoop01:9200/product/bigdata/1'

再執行更新操作的時候把版本號傳過去

覆蓋:

curl -H "Content-Type: application/json" -XPUT 'http://hadoop01:9200/product/bigdata/1?version=6' -d '{ 
	"name": "hadoop", 
	"author":"Doug Cutting",
	"version":"6.1.0"
}'

部分更新:

curl -H "Content-Type: application/json" -XPOST 'http://hadoop01:9200/product/bigdata/1/_update?version=7' -d '{ 
	"doc": {"version":"7.1.0"}	
}'

如果傳遞的版本號和待更新的文件的版本號不一致,則會更新失敗

ES如何實現版本控制(使用外部版本號)

如果你的資料庫已經存在了版本號,或者是可以代表版本的時間戳。這時就可以在ES的查詢url後面新增version_type=external來使用這些號碼。

    注意:版本號必須要是大於0小於9223372036854775807(Java中long的最大正值)的整數。

ES在處理外部版本號的時候,它不再檢查_version是否與請求中指定的數值是否相等,而是檢查當前的_version是否比指定的數值小,如果小,則請求成功。

如:

curl -H "Content-Type: application/json" -XPUT 'http://hadoop01:9200/product/bigdata/2?version=1&version_type=external' -d '{
    "name": "spark"
}'

注意: 此處url前後的引號不能省略,否則執行的時候會報錯。