在elasticsearch中的单个键下保存变量类型?

时间:2014-03-20 08:37:34

标签: elasticsearch fluentd

我有大量来自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"
          }
        }
      }
    }
  }
}

0 个答案:

没有答案