我有大量来自fluentd的文件,然后我用fluent-plugin-elasticsearch保存到elasticsearch。
其中一些文档在键name
下有一个字符串,有些文档有一个对象。
实施例
{
"name": "foo"
}
和
{
"name": {
"en": "foo",
"fi": "bar"
}
}
这些文档在我的应用程序方面是相同的类型,它们被保存到相同的弹性搜索索引。
但是弹性搜索有一个问题。当第二个文档保存到elasticsearch时,它会抛出此错误:
org.elasticsearch.index.mapper.MapperParsingException: failed to parse [name]
这似乎是因为elasticsearch已将键name
设置为字符串类型。我可以使用curl http://localhost:9200/fluentd-[tagname]/_mapping
看到这个,当我尝试将对象保存到它之后,它显然不喜欢它。
那么有什么方法可以在elasticsearch中解决这个问题吗?
我无法控制传入的文档,并且有多个具有变量类型的键 - 而不仅仅是name
。所以我不能只针对那个密钥进行单一的攻击。</ p>
这非常令人讨厌,因为这些文档完全不在elasticsearch中并发送到/ dev / null。
如果这是完全不可能的 - 至少可以将这些文件保存到文件或其他内容中,这样我就不会丢失它们吗?
这是fluentd-*
索引的模板:
{
"fluentd_template": {
"template": "fluentd-*",
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0,
"index": {
"query": {
"default_field": "msg"
},
"analysis" : {
"analyzer" : {
"default" : {
"type" : "keyword"
}
}
}
}
},
"mappings": {
"_default_": {
"_all": {
"enabled": false
},
"_source": {
"compress": true
},
"properties": {
"@timestamp": {
"type": "date",
"index": "not_analyzed"
}
}
}
}
}
}