为什么 Elasticsearch ignore_malformed 向索引添加格式错误的值?

Why does Elasticsearch ignore_malformed add malformed value to index?

我在 C# 中使用 Serilog 创建一个日志文件,该文件由 Filebeat 提取并通过 Logstash 发送到 Elasticsearch。 Elasticsearch 索引符合 ECS 1.5.

日志文件有时会包含字段 "host.ip" 的错误值,它可能包含 "localhost:5000" 这样的值。这会导致日志帖子被拒绝,因为这样的字符串无法转换为 ip 号码。这都是预料之中的,更正日志文件的问题不在本题范围内。

我决定在索引级别添加 "ignore_malformed: true" 设置。之后,日志帖子不再被拒绝——我可以在 Elasticsearch 中找到它们。因此,该设置被证明是有效的。但是字段 "host.ip" 现在实际上包含格式错误的值 "localhost:5000"。我看不出这怎么可能,这不是我所期望或想要的。

从 "ignore_malformed" 的文档来看,与字段类型不匹配的值似乎应该被丢弃 - 而不是写入字段。我也发现没有添加“_ignored”字段。

就好像将 ignore_malformed 设置为 true 实际上允许格式错误的数据进入索引,而不是删除它。如果值格式错误,我 expecting/wanting 该字段为空。这是一个错误,还是我遗漏了什么?

无论你在源文档中发送什么,它都会一直存在,ES 永远不会修改它。但是,您现在指定 ignore_malformed 这一事实意味着 ES 不会尝试索引格式错误的数据,但该值仍将在您的源文档中可见。