我的Elasticsearch系列文章,逐漸更新中八拱,歡迎關(guān)注
0A.關(guān)于Elasticsearch及實例應(yīng)用
03.如何安裝與設(shè)置Elasticsearch API
04.如果通過elasticsearch的head插件建立索引_CRUD操作
05.Elasticsearch多個實例和head plugin使用介紹
06.當Elasticsearch進行文檔索引時,它是怎樣工作的肌稻?
08.Elasticsearch中的分析和分析器應(yīng)用方式
另外對于入門小白清蚀,我強烈推薦這篇Elasticsearch手把手搭建指南給你,新手碰到的坑爹谭,這里都已經(jīng)寫了答案轧铁。
介紹
在這個簡短的博客中,我將解釋Elasticsearch中的映射以及一些常見的有用最佳實踐旦棉。在本系列博客后面的Elasticsearch中學習分析/分析器時齿风,對映射有一個很好的了解將很方便。
映射
映射不過是Elasticsearch中文檔的架構(gòu)绑洛。正如我之前在階段01的博客之一中提到的那樣最易,Elasticsearch的架構(gòu)較少地技。這意味著舔涎,與其他數(shù)據(jù)庫(例如MongoDb或MySql)不同倍试,在將文檔索引到Elasticsearch之前,無需預(yù)定義文檔的架構(gòu)绑蔫。那么這是如何工作的呢运沦?簡而言之,Elasticsearch具有檢測文檔字段類型并生成模式并將其應(yīng)用于整個索引的內(nèi)置功能配深。當然携添,這里有一些事情要注意,但是我們稍后會在本博客中再次討論篓叶。首先讓我們看看在索引示例文檔時映射是如何存在的烈掠。
步驟1
創(chuàng)建沒有任何文檔的索引。
curl -XPUT localhost:9200/testindex-0202
對于上面的命令缸托,我們將得到以下響應(yīng):
{“acknowledged”: true,”shards_acknowledged”: true,”index”: ”testindex-0202"}
現(xiàn)在左敌,讓我們通過使用如下所示的“獲取映射” API來查看是否對其應(yīng)用了任何映射:
curl -XGET localhost:9200/testindex-0202/_mapping
上面的命令將導(dǎo)致以下響應(yīng):
{“testindex-0202”: {“mappings”: {}}}
從響應(yīng)中可以看到,“映射”部分為空俐镐,這意味著在此階段沒有應(yīng)用任何映射矫限。
第2步
現(xiàn)在將文檔索引到創(chuàng)建的索引,如下所示:
curl -XPUT localhost:9200/testindex-0202/testtype/1 — d ‘{“name”: ”ArunPMohan”,”age”: 31,”married”: true}’
如您在上面的文檔中看到的,我有三個字段叼风,字段的類型是字符串(對于“名稱”字段)幸斥,整數(shù)(對于“年齡”字段)和布爾值(對于“已婚”字段)。當我們鍵入此命令時咬扇,它不會導(dǎo)致任何錯誤,這僅表示Elasticsearch已自動檢測到字段類型廊勃。上面的用于為文檔建立索引的命令從Elasticsearch產(chǎn)生以下輸出:
{“_index”: ”testindex-0202",”_type”:”testtype”,”_id”:”1",”_version”: 1,”result”: ”created”,”_shards”: {“total”: 2,”successful”: 1,”failed”: 0},”created”: true}
現(xiàn)在懈贺,在創(chuàng)建文檔之后,我們可以使用“ GET mapping” API來查看映射更改坡垫。因此梭灿,應(yīng)用以下命令:
curl -XGET localhost:9200/testindex-0202/_mapping
響應(yīng)如下所示:
{“testindex-0202”: {“mappings”: {“testtype”: {“properties”: {“age”: {“type”: “l(fā)ong”},“married”: {“type”: “boolean”},“name”: {“type”: “text”,“fields”: {“keyword”: {“type”: “keyword”,“ignore_above”: 256}}}}}}}}
在上述回復(fù)中,請注意“映射”部分冰悠。這里堡妒,映射下的第一個對象是“ testtype”「茸浚“ testtype”指示索引的類型皮迟。在“測試類型”下方,我們有“屬性”對象桑寨,該對象保存字段及其類型的列表伏尼。您可以看到“年齡”字段的類型為“長”,“已婚”字段的類型為“布爾”尉尾,“名稱”字段的類型為“文本”爆阶。“文本”類型表示字段為“字符串”類型沙咏。在名稱字段下辨图,我們還有另一個部分稱為“字段”。在以后的博客中肢藐,我們將看到更多關(guān)于“字段”部分的信息故河,現(xiàn)在,它默認包含字符串/文本字段就足夠了吆豹。
關(guān)于Mappings的認識
讓我們看一下一些重要的事情忧勿,這些事情將有助于我們更多地了解映射。
1.更新映射瞻讽。
在Elasticsearch中鸳吸,會有多種類型,每種類型都有自己的映射速勇。一旦為一個類型下的字段數(shù)生成了映射晌砾,就不能修改它。就是說烦磁,如果一個文檔包含10個字段养匈,則會生成10個映射哼勇,而我們以后將無法對其進行修改。如果我們要修改它呕乎,我們需要刪除索引积担,然后手動應(yīng)用修改后的映射,然后為數(shù)據(jù)重新索引猬仁。
這里要注意的另一重要事情是帝璧,如果我們嘗試修改現(xiàn)有映射,則上述情況是正確的湿刽,但是對于新字段的烁,我們能夠更新映射。也就是說诈闺,如果我們在文檔之間添加第11個字段渴庆,則映射將相應(yīng)地自動更新。為了使事情更加清楚雅镊,讓我們將新文檔索引到“?testindex-0202”襟雷。在新文檔的此處,除了“姓名”仁烹,“年齡”和“已婚”字段外嗤军,我們還包括一個稱為“國家”的新字段。讓我們像下面這樣做:
curl -XPUT localhost:9200/testindex-0202/testtype/2 -d ‘{“name”: ”AlexJohn”,”age”: 32,”married”: true,”country”: ”Italy”}’
現(xiàn)在像我們之前一樣操作GET映射API晃危。在結(jié)果中叙赚,您可以看到還有一個名為“國家”的字段。
2.常見錯誤
處理映射時僚饭,最常見的錯誤之一是更改字段的現(xiàn)有類型震叮。讓我們自己看看這個錯誤,并加深了解鳍鸵。
testindex-0202
到目前為止苇瓣,在索引“?”中,我們已經(jīng)索引了2個文檔偿乖。兩個文檔的“年齡”字段具有相同的類型击罪,且類型為“長”。現(xiàn)在贪薪,讓我們嘗試為文檔編制索引媳禁,如下所示:
curl -XPUT localhost:9200/testindex-0202/testtype/3 -d ‘{“name”: ”LexaMathew”,”age”: ”twenty”,”married”: false,”country”: ”Italy”}’
請注意,這里的年齡以字符串類型給出画切,表示它是一個字符串字段竣稽。上述要求的回應(yīng)如下:
{“error”: {“root_cause”: [{“type”: ”mapper_parsing_exception”,”reason”: ”failedtoparse[age]”}],”type”: ”mapper_parsing_exception”,”reason”: ”failedtoparse[age]”,”caused_by”: {“type”: ”number_format_exception”,”reason”: ”Forinputstring: \”twenty\””}},”status”: 400}
在以上響應(yīng)中,我們可以
mapper_parsing_exception
在“年齡”字段中看到錯誤“?”。這表明此處的期望字段是另一種類型毫别,而不是字符串娃弓。在這種情況下,請使用適當?shù)念愋蜑槲臋n重新編制索引或檢查數(shù)據(jù)岛宦,以查看是否有任何數(shù)據(jù)修改需要進行并相應(yīng)地更改數(shù)據(jù)格式/映射台丛。
3.應(yīng)用自定義映射
到目前為止,我們已經(jīng)看到了映射的自動生成砾肺,即映射僅由elasticsearch生成⊥烀梗現(xiàn)在,最常見的用例是應(yīng)用我們自己的映射债沮。這可以通過在Elasticsearch中使用PUT映射API來完成,如下所示:
首先創(chuàng)建一個名稱為“?testindex-0202a”?的索引
curl -XPUT localhost:9200/testindex-0202a
現(xiàn)在本鸣,使用如下所示的PUT映射API:
curl -XPUT localhost:9200/testindex-0202a/_mapping/testtype -d ‘{“properties”: {“name”: {“type”: ”text”}}}’
這將創(chuàng)建一個以“名稱”作為字符串/文本字段的映射∫唏茫現(xiàn)在,索引為“?testindex-0202a”和類型為“?testtype”的任何文檔都應(yīng)具有“文本”類型的“名稱”字段荣德。
4.應(yīng)用映射的最佳實踐
實際上闷煤,發(fā)生的事情是字段的數(shù)據(jù)類型可能在不同的時間點發(fā)生變化。因此涮瞻,需要兩次迭代才能確定文檔字段的結(jié)構(gòu)/類型鲤拿。因此,我們可能需要不斷更改索引的數(shù)據(jù)類型/結(jié)構(gòu)或映射署咽。通常建議的做法是創(chuàng)建一個Shell腳本近顷,該腳本將首先刪除現(xiàn)有索引,然后將映射應(yīng)用于該索引宁否。這種做法的優(yōu)點是窒升,刪除現(xiàn)有索引然后通過創(chuàng)建新索引來修改映射將非常容易,從而為我們節(jié)省了大量時間慕匠。
結(jié)論
在此博客中饱须,我們介紹了Elasticsearch映射的基礎(chǔ)知識,例如Elasticsearch映射的應(yīng)用台谊,一些最佳實踐以及如何將自定義映射應(yīng)用于Elasticsearch索引蓉媳。在接下來的博客中,我們將詳細介紹Elasticsearch分析和分析器锅铅。