elasticsearch 之mapping


搭好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": {
            • "type": "string"
            },
          • "active": {
            • "type": "string"
            },
          • "host": {
            • "type": "string"
            },
          • "kafka": {
            • "properties": {
              • "consumer_group": {
                • "type": "string"
                },
              • "msg_size": {
                • "type": "long"
                },
              • "offset": {
                • "type": "long"
                },
              • "partition": {
                • "type": "long"
                },
              • "topic": {
                • "type": "string"
                }
              }
            },
          • "logdate": {
            • "type": "string"
            },
          • "message": {
            • "type": "string"
            },
          • "path": {
            • "type": "string"
            },
          • "total": {
            • "type": "string"
            },
          • "type": {
            • "type": "string"
            }
          }
        }
      }
    }

}

其中我們就是要修改 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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM