Elasticsearch學習系列二(基礎操作)

2022-06-19 18:03:49

本文將分為3塊講解Es的基礎操作。分別為:索引(index)、對映(mapping)、檔案(document)。

索引操作

  1. 建立索引庫

語法:

PUT /索引名稱{
  "settings":{
    "屬性名":"屬性值"
  }
}

settings:就是索引庫的設定,可以定義如分片數、副本數等等。不設定的話就是都走預設值。

範例:

PUT /test-demo
  1. 判斷索引是否存在
HEAD /索引名稱
  1. 檢視索引
  • 檢視單個索引
GET /索引名稱
  • 批次檢視索引
GET /索引名稱1,索引名稱2
  • 檢視所有索引
GET _all
  1. 開啟索引
POST /索引名稱/_open
  1. 關閉索引
POST /索引名稱/_close
  1. 刪除索引
DELETE /索引名稱

對映操作

索引建立之後,等於有了關係型資料庫中的database。Es7.x取消了索引type型別的設定,不能指定型別,預設為_doc,但是欄位仍然是有的,我們需要設定欄位的約束資訊,叫做欄位對映(mapping)。

欄位的約束包括:

  • 欄位的資料型別
  • 是否要儲存
  • 是否要索引
  • 分詞器等
  1. 建立對映欄位

語法:

PUT /索引名/_mapping
{
  "properties":{
    "欄位名":{
      "type":"型別",
      "index":true,
      "store":true,
      "analyzer":"分詞器"
    }
  }
}
  • 欄位名:根據需要任意填寫
  • type:型別,可以是text(可分詞)、keyword(不可分詞)、long、short、date、integer、object
  • index:是否索引,預設為true
  • store:是否獨立儲存,預設為false。原始的文字會儲存在 _source 裡面,如果設定為true,則是獨立的儲存某個欄位,獲取獨立儲存欄位比從_source裡解析快,但是更佔空間。
  • analyzer:指定分詞器,一般中文可以選擇ik_max_word、ik_smart

範例:

PUT /test-demo1/_mapping
{
  "properties":{
    "name":{
      "type":"text",
      "index":true,
      "store":true,
      "analyzer":"ik_max_word"
    },
    "job":{
      "type":"text",
      "analyzer":"ik_max_word"
    },
    "logo":{
      "type":"keyword",
      "index":false
    }
    ,
    "amt":{
      "type":"double"
    }
  }
}
  1. 檢視對映關係
  • 檢視某個索引
GET /索引名稱/_mapping
  • 檢視所有索引
GET _mapping
#或者
GET _all/_mapping
  1. 修改對映關係

這裡的修改指的是新增欄位,其他更改不支援。只能刪除索引,重建對映

PUT /索引庫名/_mapping
{
 "properties": {
  "欄位名": {
   "type": "型別",
   "index": true,
   "store": true,
   "analyzer": "分詞器"
 }
}
}
  1. 一次性建立索引和對映

語法:

put /索引庫名稱
{
  "settings":{
    "索引庫屬性名":"索引庫屬性值"
},
  "mappings":{
    "properties":{
        "欄位名":{
        "對映屬性名":"對映屬性值"
      }
    }
  }
}

範例:

PUT /test-demo2
{
  "settings":{},
  "mappings": {
    "properties": {
      "name":{
        "type":"text",
        "analyzer": "ik_max_word"
      }
    }
  }
}

檔案操作

檔案,即索引庫中的資料,會根據規則建立索引,將來用於搜尋。可以類比做資料庫中的一行資料。

  1. 新增檔案

語法:

#自動生成id
POST /索引名稱/_doc
{
"field":"value"
}
#手動指定id
POST /索引名稱/_doc/1
{
"field":"value"
}

範例:

POST /test-demo1/_doc/1
{
  "name":"百度",
  "job":"運營",
  "amt":"3000.34",
  "logo":"http://www.lgstatic.com/ttasdf2",
  "createTime":"20220303230000"
  
}
  1. 檢視單個檔案
GET /索引名稱/_doc/{id}

結果如下:

{
  "_index" : "test-demo1",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "_seq_no" : 0,
  "_primary_term" : 2,
  "found" : true,
  "_source" : {
    "name" : "百度",
    "job" : "運營",
    "amt" : "3000.34",
    "logo" : "http://www.lgstatic.com/ttasdf2",
    "createTime" : "20220303230000"
  }
}

後設資料項 含義
_index document所屬index
_type document所屬type,Elasticsearch7.x預設type為_doc
_id 代表document的唯一標識,與index和type一起,可以唯一標識和定位一個document
_version document的版本號,Elasticsearch利用_version(版本號)的方式來確保應用中相互衝突的變更不會導致資料丟失。需要修改資料時,需要指定想要修改檔案的version號,如果該版本不是當前版本號,請求將會失敗
_seq_no 嚴格遞增的順序號,每個檔案一個,Shard級別嚴格遞增,保證後寫入的Doc seq_no大於先寫入的Doc的seq_no。任何型別的寫操作,包括index、create、update和Delete,都會生成一個_seq_no。
_primary_term 當Primary Shard發生重新分配時,比如重啟,Primary選舉等,_primary_term會遞增1。_primary_term主要是用來恢復資料時處理當多個檔案的_seq_no一樣時的衝突,避免Primary Shard上的寫入被覆蓋
found true/false,是否查詢到檔案
_source 儲存原始檔案
  1. 檢視所有檔案
POST /test-demo1/_search
{
  "query":{
    "match_all": {}
  }
}

  1. 僅查詢部分欄位
GET /test-demo1/_doc/1?_source=name,job
  1. 更新檔案(全部更新)
PUT /test-demo1/_doc/1
{
  "name":"百度3",
  "job":"運營",
  "amt":"3000.34",
  "logo":"http://www.lgstatic.com/ttasdf2",
  "createTime":"20220303230000"
  
}

為什麼說是全部更新呢?如果你只傳了name,其他filed不傳。那麼檔案裡就只剩name了。

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

全部更新,是直接把之前的老資料,標記為刪除狀態,然後,再新增一條更新的(使用PUT或者POST)

  1. 更新檔案(部分更新)
POST /索引名稱/_update/{id}
{
  "doc":{
    "field":"value"
  }
}
  1. 刪除檔案
  • 根據id刪除
DELETE /索引名稱/_doc/{id}
  • 根據查詢條件刪除
POST /索引名稱/_delete_by_query
{
  "query":{
    "match":{
      "欄位名":"搜尋鍵碼"
    }
  }
}
  • 刪除所有檔案
POST /索引名稱/_delete_by_query
{
  "query":{
    "match_all":{}
  }
}
  1. 檔案強制建立

本來如果不存在會建立,存在會更新。強制建立就是僅建立,不更新。已存在就報錯。

PUT /索引名稱/_doc/{id}?op_type=create
{
  "filed":"value"
}