標籤:partition 資料 search exp image 轉換 log apple ota
搭好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,如下
{
- "parking_total": {
- "mappings": {
- "parking_total": {
- "properties": {
- "@timestamp": {
- "type": "date",
- "format": "strict_date_optional_time||epoch_millis"
},
- "@version": {
},
- "active": {
},
- "host": {
},
- "kafka": {
- "properties": {
- "consumer_group": {
},
- "msg_size": {
},
- "offset": {
},
- "partition": {
},
- "topic": {
}
}
},
- "logdate": {
},
- "message": {
},
- "path": {
},
- "total": {
},
- "type": {
}
}
}
}
}
}
其中我們就是要修改 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
elasticsearch 之mapping