2

我有一堆来自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"
          }
        }
      }
    }
  }
}
4

0 回答 0