【问题标题】:Why does Elasticsearch ignore_malformed add malformed value to index?为什么 Elasticsearch ignore_malformed 会向索引添加格式错误的值?
【发布时间】:2020-06-05 23:50:18
【问题描述】:

我在 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 实际上允许格式错误的数据进入索引,而不是丢弃它。如果值格式错误,我期望/希望该字段为空。这是一个错误,还是我错过了什么?

【问题讨论】:

    标签: elasticsearch serilog filebeat


    【解决方案1】:

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

    【讨论】:

    • 所以...也许这只是我没有正确使用条款的问题。我认为“索引”或多或少等于“保存数据”,因此当文档说“格式错误的字段没有被索引”时,这意味着数据根本不会保存在 Elastic 中。我有一百万个后续问题,但我会尽量保持冷静,并根据你刚刚写的内容尝试一些事情。非常感谢!
    • 源文档“按原样”存储在_source 字段中。但是,如果该值格式错误(即localhost:5000),则不会对其进行存储/索引,并且该文档的字段host.ip 字段将为空。
    • 但是……这不是我所看到的。我在原始问题中添加了一张图片来澄清,你同意这看起来很奇怪吗?
    • 您看到的是从源文档中获取的值(使用source filtering)。同样,ES 不会触及 您的 JSON 文档中中存在的 server.ip 字段。但是,该字段的值不会被 ES 在倒排索引中索引。
    • 作为测试,您可以尝试在server.ip 上运行术语聚合,您可以确定您不会看到带有像localhost:5000 这样的键的存储桶,这意味着该值未编入索引
    猜你喜欢
    • 2012-06-10
    • 2017-01-06
    • 1970-01-01
    • 2013-01-03
    • 2018-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    相关资源
    最近更新 更多