我在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>
作为异常处理的一部分,您可以将消息推向启用动态映射的其他索引。