史上最簡單的Elasticsearch教程-第五章:Elasticsearch的restful之增刪改
Eltasticsearch的restful增刪改:
(提前宣告:文章由作者:張耀烽/CSDN主頁:https://blog.csdn.net/youbitch1/
結合自己生產中的使用經驗整理,最終形成簡單易懂的文章,寫作不易,轉載請註明)
(整個教程的ES版本以及Kibana版本都是基於5.6.8)
(文章參考:Elasticsearch權威指南(書籍),Elasticsearch官方文件JavaApi5.6.8,實際專案中的應用場景)
(幫到到您請點點關注,文章持續更新中!)
(個人Git主頁:https://github.com/Mydreamandreality)
ES的查詢體系較為龐大,所以這章只寫了增刪改,下一章單獨寫個部落格寫ES的查詢,聚合,全文檢索
本章我做了Mysql與ES的對比學習,儘量讓兄弟萌一次就能看懂
注:程式碼塊中的#是註釋
-
先從一個簡單的案例說起,就寫一個文章的CRUD吧
-
需求(我這裡先搞的簡單一些,由淺入深):
-
文章內容包括:標題,分類,作者,內容,點贊,
-
文章可以更新,新增,刪除,查詢
-
-
-
Mysql該怎麼做?
-
首先建立資料庫, 設計表結構,設定索引
-
控制面板操作:
-
insert新增測試資料
-
select查詢資料
-
update更新資料
-
delete刪除資料
-
-
-
Elasticsearch該怎麼做?
-
開啟Kibana(監測工具)-Dev Tools頁
-
新增測試資料(POST請求方式)
#為了建立文章資料,我們的操作是: #1.為每篇文章的(文件)Document建立索引,每個文件包含了文章的所有資訊 ->(要記住ES是面向文件的資料庫) #2.每個文件的型別為article ->article代表Mysql中的表 #3.article型別屬於blog索引 ->blog代表Mysql中的資料庫 #4.blog索引儲存在Elasticsearch叢集中 ->物理儲存位置 #如下,一個索引就建好了,實際上特別簡單 POST /blog/article/1 { "title":"史上最簡單的Elasticsearch教程", "classify":"Elasticsearch教程", "author":"張耀烽", "content":"第一章初識Elasticsearch", "likenum":10 } #返回"created": true代表建立成功 # 這裡 POST /blog/article/1{...JSON內容省略} 包含了五個資訊 # POST:請求方式 # blog:文章索引名稱 # article:文章型別名稱 # 1:文章的ID # {...json內容省略}:請求實體(JSON文件),包含了文章的所有內容:標題是史上最簡單的Elasticsearch教程,分類是Elasticsearch教程,作者張耀烽,內容...,點贊數量10個 ## 重點: #我剛開始學習時,在做這個操作時有很多的疑問,我列舉並且解釋一下,看一下你們是否也存在這個問題 #1.不建立資料庫建立表直接就新增資料?而且還新增成功了? #解疑:POST或者PUT的請求方式,如果Index或者Type不存在會預設建立 #2.資料型別不需要指定?比如Mysql中指定欄位型別 #解疑:這些不是必須的,如果不指定的話,ES有內建預設引數,會預設幫我們加上的 #3.索引不需要設定嗎? #解疑:預設情況下,文件中的所有欄位都會被索引(倒排索引,後續會講一下具體的實現) #如果還有什麼疑惑的地方可以在下面評論,兄弟萌一起討論一下! #OK,到這裡大致應該就瞭解ES的POST(新增)請求了,咱們再多加幾個資料,方便一面全文檢索更直觀的看到效果 POST /blog/article/2 { "title":"史上最簡單的Elasticsearch教程二", "classify":"Elasticsearch教程", "author":"張耀烽", "content":"第二章進階Elasticsearch", "likenum":100 }##...我這裡省略,兄弟萌多加幾條 ##重點啊這裡有個坑:注意第四個引數ID,一定不要重複,如果重複之前的資料會被覆蓋,相當於更新了,而且ES沒有ID自增這個概念
-
更新文章文件(PUT請求)
PUT /blog/article/1
{
"title":"更新後的史上最簡單的Elasticsearch教程",
"classify":"Elasticsearch教程",
"author":"張耀烽",
"content":"第一章初識Elasticsearch",
"likenum":10
}
#響應體
{
"_index": "blog",
"_type": "article",
"_id": "1",
"_version": 2,
"result": "updated",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"created": false
}
#可以看到,之前新增的時候created是true,現在變成了false,代表當前資料以前是存在的
#_version已經從一變為二,代表資料更改的第幾個版本
#當時學習時遇到的坑:
#ES的更新底層是這個樣子的:
##ES執行更新操作的時候,ES首先將舊的文件標記為刪除狀態,然後新增新的文件,
##舊的文件不會立即消失,但是你也無法訪問,
##ES會在你繼續新增更多資料的時候在後臺清理已經標記為刪除狀態的文件
#所以在後續使用JAVAAPI的時候你會感覺到明顯的延遲,但是這都是小事!首先既然你選擇了ES,那麼應該很少對資料進行大批量的增刪改,大部分操作都是檢索和統計
#如果你實在接受不了ES更新的緩慢,我們可以對JavaApi進行優化,(後續寫到JavaApi的時候會講解)
-
刪除文章||索引|
#刪除指定的文章,根據ID刪除
DELETE /blog/article/1
#響應體
{
"found": true,
"_index": "blog",
"_type": "article",
"_id": "1",
"_version": 3,
"result": "deleted",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
}
}
#可以看到這條資料的version已經變為三,第一次是新增,第二次是更新,這次的操作是刪除
->>>>>>>>>>>>>>>
#刪除指定索引
DELETE /blog
#響應體
{
"acknowledged": true
}
#true代表刪除成功
->>>>>>>>>>>>>>>>>>>
#如果此時我們刪除一個不存在的索引或者文件,將得到一個404 Not Found狀態碼,響應體是這樣的:
{
"found": false,
"_index": "11",
"_type": "article",
"_id": "1",
"_version": 1,
"result": "not_found",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
}
}
OK,到這裡ES基於HTTP協議的restful請求:增刪改操作就完成了,當然還可以更復雜的增刪改,但是首先:
我更新的重點是JavaApi,所以JavaApi中的複雜操作會寫的更多,ESJavaApi的操作和restful風格的請求是完全不同的.
其次你的技術團隊既然選擇了ES,那麼你的增刪改就應該是少量的,畢竟ES的優勢在於檢索
下一章我會單獨寫個部落格做ES的查詢,聚合,全文檢索,各種姿勢的騷操作,這章節要是有什麼問題就留言一起探討!