Elasticsearch CRUD基本操做

前言
本次咱們聊一聊Elasticsearch的基本操做CRUD,他跟咱們經常使用的關係型數據庫的操做又有什麼不同的地方呢?今天咱們就來好好講解一番。數據庫

說明

本次演示用的版本是7.11。
工具可使用Kibana的控制檯,界面美觀且有必定的縮進,並且能簡化命令行的curl操做,若是對安裝有問題的,能夠看一下我以前的文章。api

image.png

API約定

關係型數據庫用的是SQL進行數據的訪問,而Elasticsearch用的是REST進行數據的訪問,HTTP的請求頭PUT、GET、POST、DELETE正好能夠對應CRUD(create、read、update、delete)四種數據操做。網絡

數據的格式用的是JSON。app

索引操做

建立索引

建立索引moviecurl

PUT /movie
{
  "settings": {
    "index": {
      "number_of_shards": 1,
      "number_of_replicas": 0
    }
  }
}

number_of_shards是主分片數,number_of_replicas是一個主分片有多少個本,那麼總的分片數就是「(number_of_replicas + 1) * number_of_shards」工具

查看索引

GET /movie/

刪除索引

DELETE /movie/

文檔操做

插入文檔

7.x版本,type默認是「_doc」。能夠用POST,也能夠用PUT性能

// 自動生成_id
POST /movie/_doc
{
  "title": "The Pursuit of Happyness",
  "actors": [
    "Will Smith",
    "Jaden Smith",
    "Thandie Newton"
  ]
}

// 指定_id=1
PUT /movie/_doc/1
{
  "title": "The Pursuit of Happyness",
  "actors": [
    "Will Smith",
    "Jaden Smith",
    "Thandie Newton"
  ]
}

// 演示覆蓋
PUT /movie/_doc/1
{
  "title": "xxx"
}

若是是指定_id的狀況下(稱爲index操做),那麼若是文檔已經存在的話,會直接進行覆蓋,也就是若是裏面有些字段沒傳,那個字段就不會存儲了,好比上面第三個請求,執行完後去獲取「_id=1」的數據,只能獲取到title字段,actors字段是不存在的。測試

更新文檔

更新「_id=1」的數據,注意須要有「doc」。若是用「POST /movie/_update/1」這種語法,就直接覆蓋了。ui

POST /movie/_update/1
{
  "doc":{
    "title": "The Pursuit of Happyness xxx"
  }
}

刪除文檔

刪除「_id=1」的數據url

DELETE /movie/_doc/1

獲取文檔

獲取「_id=1」的數據

GET /movie/_doc/1

搜索文檔

GET /movies/_search
{
  "profile": "true",
  "_source": ["movieId", "title","genres"], 
  "sort": [{"movieId": "desc"}],
  "from": 0,
  "size": 3,
  "query": {
    "match_all": {}
  }
}
  • movies是以前導入的數據,非前面用的movie,須要測試的話要先導入一下數據。
  • profile 至關於MySQL中的explain
  • _source 是要返回的字段

上面的請求,類比SQL以下

select movieId, title, genres from movies order by movieId desc limit 0, 3

更復雜的搜索查詢,後面持續更新。

批量文檔操做

批量操做

POST movie/_bulk
{"index":{"_index":"movie","_id":1}}
{"title": "xxx xx"}
{"index":{"_index":"movie","_id":2}}
{"title": "The Pursuit of Happyness"}
{"update":{"_index":"movie","_id":2}}
{"doc":{"title": "xxx xx"}}

支持在一次API調用中,對不一樣的索引作不一樣的操做,減小網絡請求的次數,提升性能。支持的操做有index、create、update、delete。批量操做,若是其中一條有錯誤無法執行,不會阻礙其餘的請求,會繼續執行下去。

請求體要特別注意一下,不能格式化,並且第一行指定index跟id,第二行指定數據,以此類推。

批量讀取

請求體能夠格式化

GET _mget
{
  "docs": [
    {
      "_index": "movie",
      "_id": 1
    },
    {
      "_index": "movie",
      "_id": 2
    }
  ]
}

若是是對同一個index進行操做,能夠在URI指定index

GET movie/_mget
{
  "docs": [
    {
      "_id": 1
    },
    {
      "_id": 2
    }
  ]

批量查詢

GET /movies/_msearch
{}
{"from":0,"size":1,"query":{"match_all":{}}}
{}
{"from":0,"size":2,"query":{"match_all":{}}}

與_bulk操做相似,不能進行格式化。

相關文章
相關標籤/搜索