coerce编辑

数据并不总是干净的。根据数据的生成方式,数字可能在 JSON 主体中以真正的 JSON 数字形式呈现,例如 5,但也可能以字符串形式呈现,例如 "5"。或者,应该为整数的数字可能被渲染为浮点数,例如 5.0,甚至 "5.0"

强制尝试清理脏值以适应字段的数据类型。例如

  • 字符串将被强制转换为数字。
  • 浮点数将被截断为整数值。

例如

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

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

response = client.index(
  index: 'my-index-000001',
  id: 2,
  body: {
    number_two: '10'
  }
)
puts response
PUT my-index-000001
{
  "mappings": {
    "properties": {
      "number_one": {
        "type": "integer"
      },
      "number_two": {
        "type": "integer",
        "coerce": false
      }
    }
  }
}

PUT my-index-000001/_doc/1
{
  "number_one": "10" 
}

PUT my-index-000001/_doc/2
{
  "number_two": "10" 
}

number_one 字段将包含整数 10

此文档将被拒绝,因为强制已禁用。

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

索引级别默认值编辑

index.mapping.coerce 设置可以在索引级别设置,以在所有映射类型中全局禁用强制。

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

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

response = client.index(
  index: 'my-index-000001',
  id: 2,
  body: {
    number_two: '10'
  }
)
puts response
PUT my-index-000001
{
  "settings": {
    "index.mapping.coerce": false
  },
  "mappings": {
    "properties": {
      "number_one": {
        "type": "integer",
        "coerce": true
      },
      "number_two": {
        "type": "integer"
      }
    }
  }
}

PUT my-index-000001/_doc/1
{ "number_one": "10" } 

PUT my-index-000001/_doc/2
{ "number_two": "10" } 

number_one 字段覆盖索引级别设置以启用强制。

此文档将被拒绝,因为 number_two 字段继承了索引级别的强制设置。