我有一堆来自fluentd的文档,然后我用fluent-plugin- elasticsearch 保存到 elasticsearch 。
其中一些文档在键下有一个字符串name
,一些有一个对象。
例子
{
"name": "foo"
}
和
{
"name": {
"en": "foo",
"fi": "bar"
}
}
这些文档在我的应用程序中是相同类型的,它们保存到相同的弹性搜索索引中。
但是elasticsearch对此有一个问题。当第二个文档被保存到 elasticsearch 时,它会抛出这个错误:
org.elasticsearch.index.mapper.MapperParsingException: failed to parse [name]
这似乎是因为 elasticsearch 已将键设置name
为字符串类型。我可以看到这个使用curl http://localhost:9200/fluentd-[tagname]/_mapping
,当我之后尝试将对象保存到它时,它显然不喜欢它。
那么有没有办法在elasticsearch中解决这个问题?
我无法控制传入的文档,并且有多个具有可变类型的键 - 不仅仅是name
. 所以我不能只为那个键做一次黑客攻击。
这很烦人,因为这些文档完全被排除在 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"
}
}
}
}
}
}