前言
本次咱們聊一聊Elasticsearch的基本操做CRUD,他跟咱們經常使用的關係型數據庫的操做又有什麼不同的地方呢?今天咱們就來好好講解一番。數據庫
本次演示用的版本是7.11。
工具可使用Kibana的控制檯,界面美觀且有必定的縮進,並且能簡化命令行的curl操做,若是對安裝有問題的,能夠看一下我以前的文章。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": {} } }
上面的請求,類比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操做相似,不能進行格式化。