ignore_malformed编辑

有时您无法完全控制接收到的数据。一个用户可能会发送一个 login 字段,它是一个 date,而另一个用户发送的 login 字段则是一个电子邮件地址。

默认情况下,尝试将错误的数据类型索引到字段中会引发异常,并拒绝整个文档。如果将 ignore_malformed 参数设置为 true,则可以忽略该异常。格式错误的字段不会被索引,但文档中的其他字段会正常处理。

例如

response = client.indices.create(
  index: 'my-index-000001',
  body: {
    mappings: {
      properties: {
        number_one: {
          type: 'integer',
          ignore_malformed: true
        },
        number_two: {
          type: 'integer'
        }
      }
    }
  }
)
puts response

response = client.index(
  index: 'my-index-000001',
  id: 1,
  body: {
    text: 'Some text value',
    number_one: 'foo'
  }
)
puts response

response = client.index(
  index: 'my-index-000001',
  id: 2,
  body: {
    text: 'Some text value',
    number_two: 'foo'
  }
)
puts response
PUT my-index-000001
{
  "mappings": {
    "properties": {
      "number_one": {
        "type": "integer",
        "ignore_malformed": true
      },
      "number_two": {
        "type": "integer"
      }
    }
  }
}

PUT my-index-000001/_doc/1
{
  "text":       "Some text value",
  "number_one": "foo" 
}

PUT my-index-000001/_doc/2
{
  "text":       "Some text value",
  "number_two": "foo" 
}

此文档将索引 text 字段,但不会索引 number_one 字段。

此文档将被拒绝,因为 number_two 不允许格式错误的值。

以下 映射类型 当前支持 ignore_malformed 设置

数值型
longintegershortbytedoublefloathalf_floatscaled_float
布尔型
boolean
日期型
date
日期纳秒型
date_nanos
地理点型
用于纬度/经度点的 geo_point
地理形状型
用于多边形等复杂形状的 geo_shape
IP 地址型
用于 IPv4 和 IPv6 地址的 ip

可以使用 更新映射 API 更新现有字段上的 ignore_malformed 设置值。

索引级默认值编辑

可以在索引级别设置 index.mapping.ignore_malformed 设置,以便在所有允许的映射类型中全局忽略格式错误的内容。如果不支持该设置的映射类型在索引级别设置了该设置,则会忽略该设置。

response = client.indices.create(
  index: 'my-index-000001',
  body: {
    settings: {
      'index.mapping.ignore_malformed' => true
    },
    mappings: {
      properties: {
        number_one: {
          type: 'byte'
        },
        number_two: {
          type: 'integer',
          ignore_malformed: false
        }
      }
    }
  }
)
puts response
PUT my-index-000001
{
  "settings": {
    "index.mapping.ignore_malformed": true 
  },
  "mappings": {
    "properties": {
      "number_one": { 
        "type": "byte"
      },
      "number_two": {
        "type": "integer",
        "ignore_malformed": false 
      }
    }
  }
}

number_one 字段继承索引级设置。

number_two 字段覆盖索引级设置以关闭 ignore_malformed

处理格式错误的字段编辑

当启用 ignore_malformed 时,格式错误的字段在索引时会被静默忽略。建议尽可能减少包含格式错误字段的文档数量,否则对此字段的查询将变得毫无意义。Elasticsearch 可以轻松地通过对特殊 _ignored 字段使用 existstermterms 查询来检查有多少文档包含格式错误的字段。

JSON 对象的限制编辑

您不能将 ignore_malformed 与以下数据类型一起使用

您也不能使用 ignore_malformed 忽略提交给错误数据类型字段的 JSON 对象。JSON 对象是由大括号 "{}" 包围的任何数据,包括映射到嵌套、对象和范围数据类型的数据。

如果您将 JSON 对象提交给不支持的字段,则无论 ignore_malformed 设置如何,Elasticsearch 都会返回错误并拒绝整个文档。