在Elasticsearch中保留错误的消息



我在elasticsearch索引中具有静态映射。当一条消息与此映射不匹配时,它将被丢弃。有没有办法将其路由到错误消息的默认索引?

给您示例,我有一些具有整数类型的字段:

"status_code": { 
    "type": "integer" 
},

当消息包含数字

"status_code": 123, 

没关系。但是当它是

"status_code": "abc"

它失败。

您可以使用Ingest节点/处理器很容易地让ES进行此分流。

主要想法是使用status_code字段的convert处理器创建摄入管道,如果转换不起作用,则可以添加一个on_failure条件,该条件将把文档引导到其他索引,您可以以后进行处理。/p>

因此创建failures摄入管道:

PUT _ingest/pipeline/failures
{
  "processors": [
    {
      "convert": {
        "field": "status_code",
        "type": "integer"
      }
    }
  ],
  "on_failure": [
    {
      "set": {
        "field": "_index",
        "value": "failed-{{ _index }}"
      }
    }
  ]
}

然后,当您索引文档时,您可以简单地在参数中指定管道。用正确的状态代码索引文档将成功:

PUT test/doc/1?pipeline=failures
{
  "status_code": 123
}

但是,试图用不良状态代码索引文档,实际上也将成功,但是您的文档将在failed-test索引中索引,而不是test ONE:

PUT test/doc/2?pipeline=failures
{
  "status_code": "abc"
}

运行这两个命令后,您会看到:

GET failed-test/_search
{
  "took" : 3,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "failed-test",
        "_type" : "doc",
        "_id" : "2",
        "_score" : 1.0,
        "_source" : {
          "status_code" : "abc"
        }
      }
    ]
  }
}

总结一下,您不必在客户端代码中处理该特殊情况,并且可以完全利用ES Ingest节点来完成相同的任务。

您可以设置参数ignore malformed,以忽略使用类型不匹配而不是整个文档的字段。

您可以尝试将其与多场相结合,该场允许您以不同的方式映射相同的值。

您可能需要这样的东西:

"status_code": {
          "type": "integer",
          "fields": {
            "as_string": { 
              "type":  "keyword"
          }
     }
} 

以这种方式,您将拥有一个名为status_code的字段为intenger,并且在名为status_code.as_string作为keyword的字段中具有相同的值,但是您应该测试以查看是否真的做您想要的。

使用严格的映射,您将能够捕获Elastic提出的异常。

以下是弹性文档的摘录:

默认情况下,当在文档中找到以前看不见的字段时,Elasticsearch将在类型映射中添加新字段。可以通过将动态参数设置为false(忽略新字段)或严格(如果遇到未知字段,请忽略新字段),可以在文档和对象级别上禁用此行为。strong>

作为异常处理的一部分,您可以将消息推向启用动态映射的其他索引。

最新更新