Elasticsearch之_default_—— 為索引新增預設對映
阿新 • • 發佈:2018-12-30
前篇說過,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的原始碼。