本文通過Kibana插件, 示範了Elasticsearch的基礎文法: 添加删除索引(index), 并對索引中的文檔(document)進行增删改次(CRUD)操作.
目錄
- 1 建立、删除索引
- 1.1 建立索引
- 2.2 删除索引
- 2 document的結構
- 3 添加文檔
- 4 查詢文檔
- 5 修改文檔
- 5.1 替換文檔
- 5.2 更新文檔
- 6 删除文檔
- 版權聲明
向ES中添加文檔時, ES會根據文檔中各個字段的類型, 自動推測并建立映射(mapping), 這是比Solr靈活的地方;
這在大部分情況下是可用的, 但生産環境中不建議如此使用: 應該根據業務需求定制mapping映射. 關于定制mapping, 請參考後續文章.
# 建立索引API:
PUT test_index?pretty
# 響應資訊如下:
#! Deprecation: the default number of shards will change from [5] to [1] in 7.0.0;
# if you wish to continue using the default of [5] shards, you must manage this on the create index request or with an index template
{
"acknowledged": true,
"shards_acknowledged": true,
"index": "test_index"
}
# 檢視叢集中的索引:
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
yellow open test_index hMeJ-M9pSHSXl0t39OedYw 5 1 0 0 1.2kb 1.2kb
yellow open .kibana_1 4q7ELvdcTVilW3UwtMWqeg 1 0 18 0 78.5kb 78.5kb
過時說明:
在建立索引時, Elasticsearch提出過時警告: 從7.0.0版本開始, 預設的Shard個數将從[5]變為[1].
如果要繼續使用預設的[5]個分片(Shard), 就需要在建立Index時指定, 或者通過索引模闆建立Index.
關于建立Index時指定分片個數的方法, 參見後續的博文.
# 删除索引API:
DELETE test_index?pretty
# 響應資訊如下:
{
"acknowledged": true
}
ES是一款面向文檔的資料搜尋、分析引擎. document結構說明:
(1) 基于面向對象的開發思想, 應用系統中的資料結構都是很複雜的: 對象中嵌套對象, 如CRM系統中的客戶對象中, 還會嵌入客戶相關的企業對象.
(2) 對象資料存儲到資料庫中, 需要分解, 将嵌套對象分解為扁平的多張表資料, 每次操作時需要還原回對象格式, 過程繁瑣.
(3) ES存儲的是JSON格式的文檔, 基于此, ES可以提供複雜的索引, 全文檢索, 分析聚合等功能.
(4) document格式示例:
{ "id": "5220", "name": "張三", "sex": "男", "age": 25, "phone": 13312345678, "email": "[email protected]", "company": { "name": "Alibaba", "location": "杭州" }, "join_date": "2018/11/01" }
接下來以電商系統中的搜尋子系統為例, 示範對文檔的操作方法.
(1) 添加API:
PUT index/type/id
{
"JSON格式的文檔資料"
}
說明: ES會自動建立PUT API中指定的index和type, 不需要提前建立;
而且ES預設對document的每個field都建立反向索引, 保證它們都可以被檢索.
(2) 添加示例:
PUT book_shop/it_book/1
{
"name": "Java程式設計思想",
"author": "[美] Bruce Eckel",
"category": "程式設計語言",
"desc": "Java學習必讀經典,殿堂級著作!",
"price": 109.0,
"publisher": "機械工業出版社",
"date": "2007-06-01",
"tags": [ "Java", "程式設計語言" ]
}
(3) 添加之後的響應資訊:
{
"_index" : "book_shop",
"_type" : "it_book",
"_id" : "1",
"_version" : 1,
"result" : "created", # 操作結果: created(建立)了索引
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1
}
(4) 再添加如下資料:
PUT book_shop/it_book/2
{
"name": "深入了解Java虛拟機:JVM進階特性與最佳實踐",
"author": "周志明",
"category": "程式設計語言",
"desc": "Java圖書領域公認的經典著作",
"price": 79.0,
"date": "2013-10-01",
"publisher": "機械工業出版社",
"tags": [ "Java", "虛拟機", "最佳實踐" ]
}
PUT book_shop/it_book/3
{
"name": "Java并發程式設計的藝術",
"author": "方騰飛,魏鵬,程曉明",
"category": "程式設計語言",
"desc": "阿裡系工程師的并發程式設計實踐",
"price": 59.0,
"date": "2015-07-10",
"publisher": "機械工業出版社",
"tags": [ "Java", "并發程式設計" ]
}
(1) 檢索API:
GET index/type/id
(2) 檢索示例:
GET book_shop/it_book/2
(3) 檢索的結果:
{
"_index" : "book_shop1",
"_type" : "it_book",
"_id" : "2",
"_version" : 1,
"_seq_no" : 0,
"_primary_term" : 1,
"found" : true,
"_source" : {
"name" : "深入了解Java虛拟機:JVM進階特性與最佳實踐",
"author" : "周志明",
"category" : "程式設計語言",
"desc" : "Java圖書領域公認的經典著作",
"price" : 79.0,
"date" : "2013-10-01",
"publisher" : "機械工業出版社",
"tags" : [
"Java",
"虛拟機",
"最佳實踐"
]
}
}
(1) 替換API - 與添加API相同, 隻不過文檔id要存在, 此時系統将判定為修改操作:
—— 無論文檔資料是否存在修改, 對同一id的文檔執行1次以上的PUT操作, 都是修改操作.
PUT index/type/id
{
"JSON格式的文檔資料"
}
注意: 替換方式的不便之處: 必須填寫要修改文檔的所有field, 如果缺少, 修改後的文檔中将丢失相關field.
(2) 替換示例 - 為name添加了"(第4版)"
PUT book_shop/it_book/1
{
"name": "Java程式設計思想(第4版)",
"author": "[美] Bruce Eckel",
"category": "程式設計語言",
"desc": "Java學習必讀經典,殿堂級著作!",
"price": 109.0,
"date": "2007-06-01",
"publisher": "機械工業出版社",
"tags": [ "Java", "程式設計語言" ]
}
(3) 替換的結果資訊:
{
"_index" : "book_shop",
"_type" : "it_book",
"_id" : "1",
"_version" : 2,
"result" : "updated", // 操作結果: updated(修改)了索引
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 1,
"_primary_term" : 1
}
(1) 更新API:
—— 通過
POST
和
_update
, 更新文檔中的特定字段(field), 其他的字段不會改動.
POST index/type/id/_update
{
"doc": {
"field u want to update": "new value of ur update's field"
}
}
注意: 與替換方式相比, 更新方式的好處: 可以更新指定文檔的指定field, 未指定的field也不會丢失.
(2) 更新示例 - 将name改為英文:
POST book_shop/it_book/1/_update
{
"doc": {
"name": "Thinking in Java(4th Edition) "
}
}
(3) 更新的結果資訊:
{
"_index" : "book_shop",
"_type" : "it_book",
"_id" : "1",
"_version" : 3,
"result" : "updated", // 操作結果: updated(修改)了索引
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 2,
"_primary_term" : 1
}
此時檢視該文檔
GET book_shop/it_book/1
, 可以發現更新成功.
(1) 删除API:
DELETE index/type/id
(2) 删除示例:
DELETE book_shop/it_book/1
(3) 删除的結果資訊:
{
"_index" : "book_shop",
"_type" : "it_book",
"_id" : "1",
"_version" : 4,
"result" : "deleted", // 操作結果: deleted(删除)了索引
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 3,
"_primary_term" : 1
}
(4) 删除确認: 再次檢視删除的文檔:
GET book_shop/it_book/1
(5) 确認的資訊:
{
"_index" : "book_shop",
"_type" : "it_book",
"_id" : "1",
"found" : false // 沒有查找到相關文檔
}
為了後期示範的友善, 再次将該文檔添加至索引中:PUT book_shop/it_book/1 { "name": "Java程式設計思想(第4版)", "author": "[美] Bruce Eckel", "category": "程式設計語言", "desc": "Java學習必讀經典,殿堂級著作!", "price": 109.0, "date": "2007-06-01", "publisher": "機械工業出版社", "tags": [ "Java", "程式設計語言" ] }
作者: 馬瘦風(https://healchow.com)
出處: 部落格園 馬瘦風的部落格(https://www.cnblogs.com/shoufeng)
感謝閱讀, 如果文章有幫助或啟發到你, 點個[好文要頂👆] 或 [推薦👍] 吧😜
本文版權歸部落客所有, 歡迎轉載, 但 [必須在文章頁面明顯位置标明原文連結], 否則部落客保留追究相關人員法律責任的權利.