我使用logstash索引elasticsearch上的一些mysql数据:
input {
jdbc {
// JDBC configurations
}
}
output {
elasticsearch {
index => ""
document_type => ""
document_id => ""
hosts => [ "" ]
}
}
检查结果时,我发现elasticsearch会自动将文本标记为:
"Foo/Bar" -> "Foo", "Bar"
"The thing" -> "The", "thing"
"Fork, Knife" -> "Fork", "Knife"
嗯,这对我的大部分领域来说都没问题。但是我有一个特定的领域,我希望有一个自定义标记器。它是逗号分隔的字段(或分号分隔)。所以它应该是:
"Foo/Bar" -> "Foo/Bar"
"The thing" -> "The thing"
"Fork, Knife" -> "Fork", "Knife"
如果有办法在我的logstash配置中配置它,我会徘徊。
更新
这是我拥有的索引的一个例子。具体字段为kind
:
{
"index-name": {
"aliases": {},
"mappings": {
"My-type": {
"properties": {
"@timestamp": {
"type": "date",
"format": "strict_date_optional_time||epoch_millis"
},
"@version": {
"type": "string"
},
"kind": {
"type": "string"
},
"id": {
"type": "long"
},
"text": {
"type": "string"
},
"version": {
"type": "string"
}
}
}
},
"settings": {
"index": {
"creation_date": "",
"number_of_shards": "",
"number_of_replicas": "",
"uuid": "",
"version": {
"created": ""
}
}
},
"warmers": {}
}
}
答案 0 :(得分:2)
可以使用index template来完成此操作。
首先删除当前索引:
AVPlayerLayer
然后使用DELETE index_name
字段的相应映射为您的索引创建模板,如下所示:
kind
然后,您可以再次运行Logstash,并使用正确的映射重新创建索引。
答案 1 :(得分:0)
嗯,这个问题的正确答案是:你不能通过logstash来做到这一点。所以我不得不再添加一个步骤。
我终于按照@Val显示的路径完成了这项工作。谢谢,伙计。因此,我必须做的是在logstash ETL之前使用特定的标记化器创建索引:
{
"settings": {
"analysis": {
"analyzer": {
"simple_analyzer": {
"tokenizer": "simple_tokenizer"
}
},
"tokenizer": {
"simple_tokenizer": {
"type": "pattern",
"pattern": ","
}
}
}
},
"template": "my-index",
"mappings": {
"my-type": {
"properties": {
"kind": {
"type": "string",
"analyzer": "simple_analyzer"
}
}
}
}
}
这将通过逗号为kind
字段创建一个tokenizer。之后,我可以执行logstash etl,它不会覆盖kind
属性。