前篇说过,ES可以自动为文档设定索引。但是问题也来了——如果默认设置的索引不是我们想要的,该怎么办呢? 要知道ES这种搜索引擎都是以Index为实际的分区,Index里面包含了不同的类型,不同的类型是逻辑上的分区;每种类型可能包含有相同的字段,如果字段的类型相同还好,如果不同....那就会导致字段的冲突了。 本篇就讲述如何使用REST API以及Logstash设置默认的索引。 更多内容参考:Elasticsearch知识汇总
使用Rest API设置默认的索引
首先先看一下不设置默认索引时,我们想要索引一个IP地址的字段,会发生什么?输入下面的命令:
代码语言:javascript复制$ curl -XPUT localhost:9200/test/test/1 -d '{"ip":"192.168.0.1"}'
查看映射可以发现,我们想要存储成IP类型,但是默认给存储成了字符串类型:
代码语言:javascript复制$ curl -XGET localhost:9200/test/_mapping?pretty {
"test" : {
"mappings" : {
"test" : {
"properties" : {
"ip" : {
"type" : "string"
}
}
}
}
}
}
这并不是我们想要的。
由于映射一旦设定好了,就不能修改了。因此再次实验的时候,需要删除索引test
代码语言:javascript复制$ curl -XDELETE localhost:9200/test
{"acknowledged":true}
然后设置test的默认映射:
代码语言:javascript复制$ curl -XPUT localhost:9200/test?pretty -d '{"mappings":{"_default_":{"properties":{"ip":{"type":"ip"}}}}}'
上面的命令中,设置test索引中,默认字段ip的属性为ip。这样我们查询test的映射时,发现ip字段已经被设置为ip:
代码语言:javascript复制$ curl -XGET localhost:9200/test/_mapping?pretty {
"test" : {
"mappings" : {
"_default_" : {
"properties" : {
"ip" : {
"type" : "ip"
}
}
}
}
}
}
然后插入一段数据,为了观察到插入数据后的映射的变化,可以多插入一个字段:
代码语言:javascript复制$ curl -XPUT localhost:9200/test/test/2 -d '{"name":"xingoo","ip":"192.168.0.1"}'
然后查询映射,可以读取到默认映射信息以及当前的映射信息:
代码语言:javascript复制$ 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中默认索引的设置是基于模板的,原理上跟上面差不多。
首先我们需要指定一个默认的映射文件,文件的内容大致如下:
代码语言:javascript复制{
"template" : "logstash-*",
"mappings" : {
"_default_" : {
"properties" : {
"ip" :{
"type":"ip"
}
}
}
}
}
其中template定义了匹配的索引模式,如果针对于特定的某个索引,则直接写成索引的名字即可。下面定义了映射的相关信息,与API的内容相同。
有了上面的配置文件,就可以在Logstash中配置output插件了:
代码语言:javascript复制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的源码。
参考
【1】_default_映射:https://www.elastic.co/guide/en/elasticsearch/reference/current/default-mapping.html
【2】Elasticsearch output插件:https://www.elastic.co/guide/en/logstash/current/plugins-outputs-elasticsearch.html
【3】ELK电子书:http://kibana.logstash.es/content/logstash/plugins/output/elasticsearch.html