袁庭新老師ES系列10節(jié)|使?kibana對?檔操作
前言
在前面的小節(jié)中,我們已經(jīng)給大家介紹了Elasticsearch中文檔的相關(guān)概念,想必有些同學(xué)都已經(jīng)忘記了,那我們一塊兒再來回顧下,文檔即索引庫中某個類型下的數(shù)據(jù),會根據(jù)規(guī)則創(chuàng)建索引,將來用來搜索??梢灶惐茸鰯?shù)據(jù)庫中的每一行數(shù)據(jù)。本章節(jié)袁老師繼續(xù)帶領(lǐng)同學(xué)們來探索Elasticsearch文檔操作的相關(guān)內(nèi)容。
一. 文檔增刪改查操作
1.新增文檔
1.1 新增文檔并隨機(jī)生成id
通過POST請求,可以向一個已經(jīng)存在的索引庫中添加文檔數(shù)據(jù)。
語法格式:
演示示例:
響應(yīng)結(jié)果:
演示效果見下:

另外,需要注意的是,在響應(yīng)結(jié)果中有一個_id字段,這個就是這條文檔數(shù)據(jù)的唯一標(biāo)識,以后的增刪改查都依賴這個id作為唯一標(biāo)識。
可以看到id的值為v0aZtYIBep1a4UbIQ74E,這里我們新增時沒有指定id,所以是ES幫我們隨機(jī)生成的id。
1.2 新增文檔并自定義id
如果我們想要自己新增的時候指定id,可以這么做。
語法格式:
演示示例:
響應(yīng)結(jié)果:
具體演示效果見下:

通過運行的響應(yīng)結(jié)果可以看出,新增的文檔數(shù)據(jù)的`_id`字段的取值為1,表明自定義分配id值生效。
2.查看文檔
根據(jù)Rest風(fēng)格,新增是POST,查詢是GET,不過查詢一般都需要條件,這里我們把剛剛生成數(shù)據(jù)的id帶上。
通過Kibana查看數(shù)據(jù):
響應(yīng)結(jié)果:
屬性說明:

自動生成的id,長度為20個字符,URL安全,Base64編碼,GUID(全局唯一標(biāo)識符)分布式系統(tǒng)并行生成時不可能會發(fā)生沖突。
在實際開發(fā)中不建議使用ES生成的id,太長且為字符串類型,檢索時效率低。建議將數(shù)據(jù)表中唯一的id,作為ES的文檔id。
3.修改數(shù)據(jù)
PUT表示修改文檔。不過修改必須指定id。分為以下兩種情況:
如果id對應(yīng)的文檔存在,則修改。
如果id對應(yīng)的文檔不存在,則新增。
比如我們使用id為2不存在的一個id,則是新增數(shù)據(jù):
響應(yīng)結(jié)果:可以看到輸出結(jié)果中的result屬性的取值為created ,表示是新增數(shù)據(jù)操作。
具體顯示效果見下:

我們再次執(zhí)行剛才的請求,不過把數(shù)據(jù)調(diào)整一下:
查看結(jié)果:可以看到輸出結(jié)果中的result屬性的取值為updated,表示是更新數(shù)據(jù)操作。
具體演示效果見下:

4.刪除數(shù)據(jù)
4.1 刪除數(shù)據(jù)操作
刪除使用DELETE請求,同樣需要根據(jù)id進(jìn)行刪除。語法格式:
DELETE /索引庫名/類型名/id值
演示示例:
響應(yīng)結(jié)果:
具體演示效果見下

4.2 刪除數(shù)據(jù)出錯問題
4.2.1 問題原因
在執(zhí)行刪除數(shù)據(jù)操縱提示如下錯誤。
經(jīng)查閱資料發(fā)現(xiàn),此問題是由于ES數(shù)據(jù)存儲磁盤剩余空間過少導(dǎo)致的。即ES存在一種flood_stage的機(jī)制。默認(rèn)的磁盤空間設(shè)置為95%,當(dāng)磁盤占用超過此值閾值時,將會觸發(fā)flood_stage機(jī)制,ES強(qiáng)制將各索引index.blocks.read_only_allow_delete設(shè)置為true,即ES索引均被設(shè)置為僅允許只讀只刪,不允許新增。
4.2.2 解決方法
1.在kibana中執(zhí)行以下命令。
說明:執(zhí)行完以后,無需重啟。
2.或者主機(jī)上直接執(zhí)行如下命令。
(1) 在主機(jī)上直接執(zhí)行此命令。
(2) 在主機(jī)上直接執(zhí)行此命令。
說明:以上兩種方式二選其一。
二. 智能判斷
剛剛我們在新增數(shù)據(jù)時,添加的字段都是提前在類型中定義過的,如果我們添加的字段并沒有提前定義過,能夠成功嗎?
事實上Elasticsearch非常智能,你不需要給索引庫設(shè)置任何mapping映射,它也可以根據(jù)你輸入的數(shù)據(jù)來判斷類型,動態(tài)添加數(shù)據(jù)映射。
演示示例:我們額外添加stock庫存、saleable是否上架、subTitle副標(biāo)題這3個字段。
響應(yīng)結(jié)果:
具體演示效果見下:

查詢yx索引庫:
響應(yīng)結(jié)果:
通過響應(yīng)結(jié)果可以發(fā)現(xiàn)stock、saleable、subTitle字段都被成功添加到了yx索引庫中的映射中。
在對subTitle字段做數(shù)據(jù)初始化的時候,設(shè)置的是字符串類型數(shù)據(jù),ES無法智能判斷,它就會存入兩種字段類型。例如:
subtitle:text類型
subtitle.keyword:keyword類型
這種智能映射,底層原理是動態(tài)模板映射,如果我們想修改這種智能映射的規(guī)則,其實只要修改動態(tài)模板即可。
三. 動態(tài)模板
1.動態(tài)模板介紹
動態(tài)模板允許您更好地控制Elasticsearch如何在默認(rèn)動態(tài)字段映射規(guī)則之外映射數(shù)據(jù)。通過將動態(tài)參數(shù)設(shè)置為true或runtime,可以啟用動態(tài)映射。然后,您可以使用動態(tài)模板定義自定義映射,這些映射可以應(yīng)用于基于匹配條件動態(tài)添加的字段:
match_mapping_type:對Elasticsearch檢測到的數(shù)據(jù)類型進(jìn)行操作。
match和unmatch :使用模式匹配字段名。
path_match和path_unmatch:在字段的全點路徑上操作。
如果動態(tài)模板未定義match_mapping_type、match或path_match,則不會匹配任何字段。您仍然可以在批量請求的dynamic_templates部分中按名稱引用模板。
在映射規(guī)范中使用{name}和{dynamic_type}模板變量作為占位符。
提醒:只有當(dāng)字段包含具體值時,才會添加動態(tài)字段映射。當(dāng)字段包含null或空數(shù)組時,Elasticsearch不會添加動態(tài)字段映射。如果在dynamic_template中使用了null_value選項,那么它只會在第一個具有該字段具體值的文檔被索引之后才會被應(yīng)用。
動態(tài)模板指定為命名對象數(shù)組:
1.模板名稱可以是任何字符串值。
2.匹配條件可以包括以下任一項:match_mapping_type、match、match_pattern、unmatch、path_match、path_unmatch。凡是符合條件的未定義字段,都會按照這個規(guī)則來映射。
3.匹配字段應(yīng)使用的映射。
2.動態(tài)模板案例
舉例,我們可以把所有未映射的string類型數(shù)據(jù)自動映射為keyword類型。
在這個案例中,我們定義了兩個映射配置:
title字段:統(tǒng)一映射為text類型,并制定分詞器。
其它字段:只要是string類型,統(tǒng)一都處理為keyword類型。
這樣,未知的string類型數(shù)據(jù)就不會被映射為text和keyword并存,而是統(tǒng)一以keyword來處理。我們試試看新增一個數(shù)據(jù):
具體演示效果見下:

我們只對title做了配置,現(xiàn)在來看看images和price會被映射為什么類型。
響應(yīng)結(jié)果:
可以看到images被映射成了keyword,而非之前的text和keyword并存,說明我們的動態(tài)模板生效了。

四. 結(jié)語
這一章節(jié)的內(nèi)容比較多,趕緊趁熱打鐵復(fù)習(xí)下所學(xué)的內(nèi)容。首先,介紹了在ES中文檔的增刪改查的操作;然后,介紹了ES的智能判斷,動態(tài)添加數(shù)據(jù)映射。最后,介紹了ES中的動態(tài)模板相關(guān)的語法并進(jìn)行了案例演示。其中,涉及了一些語法和概念,需要去加深記憶和鞏固。這一章節(jié)的內(nèi)容,就給大家介紹到這里,那就期待袁老師的下一篇文章吧。