【问题标题】:How to treat certain field values as null in `Elasticsearch`如何在`Elasticsearch`中将某些字段值视为null
【发布时间】:2017-01-20 18:13:13
【问题描述】:

我正在解析日志文件,为简单起见,假设将具有以下格式:

{"message": "hello world", "size": 100, "forward-to": 127.0.0.1}

我将这些行索引到 Elasticsearch 索引中,我在其中定义了一个自定义映射,使 messagesizeforward-to 的类型为 text,分别为integerip。但是,一些日志行看起来像这样:

{"message": "hello world", "size": "-", "forward-to": ""}

Elasticsearch 尝试索引这些文档时,这会导致解析错误。由于技术原因,预处理这些文档并将"-""" 更改为null 对我来说非常重要。无论如何定义我的映射应该将哪些值视为 null ?是否有一个我可以编写的分析器适用于任何字段类型,我可以添加到我的映射中的所有条目中?

基本上我正在寻找与null_value 选项相反的东西。我不想告诉 Elasticsearchnull_value 变成什么,而是告诉它应该变成null_value。也可以接受的方法是告诉 Elasticsearch 简单地忽略看起来以某种方式但仍解析文档中其他字段的字段。

【问题讨论】:

  • 我刚刚意识到有一个ignore_malformed 选项...
  • 或者您可以创建一个自定义分析器来删除“空”标记

标签: elasticsearch


【解决方案1】:

所以这显然很容易。将以下内容添加到您的映射设置中:

{
  "settings": {
    "index": {
      "mapping": {
        "ignore_malformed": "true"
      }
    }
  }
}

这仍然会索引该字段(与我从文档中理解的内容相反...)但在聚合期间它将被忽略(因此,如果您在 integer 字段中有 3 个条目是 "1"3"hello world",平均聚合将产生 2)。

请记住,由于该选项的实现方式(我会说这是一个错误),对于作为具体值输入的 object 仍然会失败,反之亦然。如果您想解决这个问题,可以将字段的 enabled 值设置为 false,如下所示:

{
  "mappings": {
    "my_mapping_name": {
      "properties": {
        "my_unpredictable_field": {
          "enabled": false
        }
      }
    }
  }
}

这是有代价的,因为这意味着该字段不会被索引,但输入的值仍将被存储,因此您仍然可以通过在另一个字段中搜索该文档来访问它们。这通常不应该是一个问题,因为您可能不会根据这种不可预测的字段的值过滤文档,但这取决于您的具体案例使用。关于这个问题的官方讨论见here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-01
    • 1970-01-01
    • 2021-04-14
    • 2021-02-19
    • 1970-01-01
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    相关资源
    最近更新 更多