搭好elk 后,有時候會發現kibana 統計數據時,數據類型不對,這個時候就和elasticsearch的mapping有關,雖然我們可以用logstash修改傳入es里的數據類型,比如 float 或者int 或者string。但是沒有double等類型,就算轉換了,你會發現寫入es的數據還是根據es里mapping表來定義的。接下來我們來學習修改es的mapping,當然mapping的功能有很多種,比如定義索引是否分詞,分片和副本的數量是多少等等。
1) 什么是mapping
ES的mapping非常類似於靜態語言中的數據類型:聲明一個變量為int類型的變量, 以后這個變量都只能存儲int類型的數據。同樣的, 一個number類型的mapping字段只能存儲number類型的數據。
同語言的數據類型相比,mapping還有一些其他的含義,mapping不僅告訴ES一個field中是什么類型的值, 它還告訴ES如何索引數據以及數據是否能被搜索到。
當你的查詢沒有返回相應的數據, 你的mapping很有可能有問題。當你拿不准的時候, 直接檢查你的mapping。
2) 剖析mapping
一個mapping由一個或多個analyzer組成, 一個analyzer又由一個或多個filter組成的。當ES索引文檔的時候,它把字段中的內容傳遞給相應的analyzer,analyzer再傳遞給各自的filters。
filter的功能很容易理解:一個filter就是一個轉換數據的方法, 輸入一個字符串,這個方法返回另一個字符串,比如一個將字符串轉為小寫的方法就是一個filter很好的例子。
一個analyzer由一組順序排列的filter組成,執行分析的過程就是按順序一個filter一個filter依次調用, ES存儲和索引最后得到的結果。
總結來說, mapping的作用就是執行一系列的指令將輸入的數據轉成可搜索的索引項。
3)實戰轉換mapping數據類型
我們使用logstash 傳入一個索引,這個時候這個索引加載的為默認mapping,如下
{
}
其中我們就是要修改 total 和 active 這2個字段,修改mapping時需要將索引全部刪除。這里我們來操作一下
接下來,我們先創建這個索引的mapping 因為索引沒有的時候,mapping也可以存在,其實是刪除索引的時候mapping 不會跟着刪除的,當然創建的時候,如果有的字段沒有定義,mapping 會自動按照默認來定義。
{ "mappings":
{
"parking_total" : {
"properties" : {
"@timestamp" : {
"type" : "date"
},
"message" : {
"type" : "string"
},
"total" : {
"type" : "double"
},
"active" : {
"type" : "double"
}
}
}
}
}
這樣在重新導入數據,就成功啦。
by:V