1. 程式人生 > >Elasticsearch之_default_—— 為索引新增預設對映

Elasticsearch之_default_—— 為索引新增預設對映

前篇說過,ES可以自動為文件設定索引。但是問題也來了——如果預設設定的索引不是我們想要的,該怎麼辦呢?

要知道ES這種搜尋引擎都是以Index為實際的分割槽,Index裡面包含了不同的型別,不同的型別是邏輯上的分割槽;每種型別可能包含有相同的欄位,如果欄位的型別相同還好,如果不同....那就會導致欄位的衝突了。

本篇就講述如何使用REST API以及Logstash設定預設的索引。

使用Rest API設定預設的索引

首先先看一下不設定預設索引時,我們想要索引一個IP地址的欄位,會發生什麼?輸入下面的命令:

$ curl -XPUT localhost:9200/test/test/1
-d '{"ip":"192.168.0.1"}'

檢視對映可以發現,我們想要儲存成IP型別,但是預設給儲存成了字串型別:

$ curl -XGET localhost:9200/test/_mapping?pretty           {
  "test" : {
    "mappings" : {
      "test" : {
        "properties" : {
          "ip" : {
            "type" : "string"
          }
        }
      }
    }
  }
}

這並不是我們想要的。

由於對映一旦設定好了,就不能修改了。因此再次實驗的時候,需要刪除索引test

$ curl -XDELETE localhost:9200/test                        
{"acknowledged":true}

然後設定test的預設對映:

$ curl -XPUT localhost:9200/test?pretty -d '{"mappings":{"_default_":{"properties":{"ip":{"type":"ip"}}}}}'

上面的命令中,設定test索引中,預設欄位ip的屬性為ip。這樣我們查詢test的對映時,發現ip欄位已經被設定為ip:

$ curl -XGET localhost:9200/test/_mapping?pretty           {
  "test" : {
    "mappings" : {
      "_default_" : {
        "properties" : {
          "ip" : {
            "type" : "ip"
          }
        }
      }
    }
  }
}

然後插入一段資料,為了觀察到插入資料後的對映的變化,可以多插入一個欄位:

$ curl -XPUT localhost:9200/test/test/2 -d '{"name":"xingoo","ip":"192.168.0.1"}'

然後查詢對映,可以讀取到預設對映資訊以及當前的對映資訊:

$ curl -XGET localhost:9200/test/_mapping?pretty           {
  "test" : {
    "mappings" : {
      "test" : {
        "properties" : {
          "ip" : {
            "type" : "ip"
          },
          "name" : {
            "type" : "string"
          }
        }
      },
      "_default_" : {
        "properties" : {
          "ip" : {
            "type" : "ip"
          }
        }
      }
    }
  }
}

恭喜~IP欄位的型別已經變成了ip,類似的,我們可以設定date,geo,object等型別。

在Logstash中配置預設的索引

Logstash中預設索引的設定是基於模板的,原理上跟上面差不多。

首先我們需要指定一個預設的對映檔案,檔案的內容大致如下:

{
  "template" : "logstash-*",
  "mappings" : {
    "_default_" : {
       "properties" : {
             "ip" :{
                  "type":"ip"
             }
          }
       }
    }
}    

其中template定義了匹配的索引模式,如果針對於特定的某個索引,則直接寫成索引的名字即可。下面定義了對映的相關資訊,與API的內容相同。

有了上面的配置檔案,就可以在Logstash中配置output外掛了:

output {
    elasticsearch {
        host => "localhost" #ES的伺服器地址
        protocol => "http" #使用的協議,預設可能會使用Node,具體還要看機器的環境
        index => "logstash-%{+YYYY.MM.dd}" #匹配的索引模式
        document_type => "test" #索引的型別,舊的配置會使用index_type,但是這個欄位在新版本中已經被捨棄了,推薦使用document_type
       manage_template => true #注意預設為true,一定不能設定為false
        template_overwrite => true #如果設定為true,模板名字一樣的時候,新的模板會覆蓋舊的模板
        template_name => "myLogstash" #注意這個名字是用來查詢對映配置的,儘量設定成全域性唯一的
      template => "D:/test/logstash.conf" #對映配置檔案的位置
    }
}

其中後四個是使用預設對映需要注意的地方,詳細的可以多瞭解Logstash的原始碼。

參考