copy_to编辑

copy_to 参数允许您将多个字段的值复制到一个组字段中,然后可以将该组字段作为一个字段进行查询。

如果您经常搜索多个字段,则可以使用 copy_to 搜索更少的字段来提高搜索速度。请参阅尽可能少地搜索字段

例如,可以将 first_namelast_name 字段复制到 full_name 字段,如下所示

response = client.indices.create(
  index: 'my-index-000001',
  body: {
    mappings: {
      properties: {
        first_name: {
          type: 'text',
          copy_to: 'full_name'
        },
        last_name: {
          type: 'text',
          copy_to: 'full_name'
        },
        full_name: {
          type: 'text'
        }
      }
    }
  }
)
puts response

response = client.index(
  index: 'my-index-000001',
  id: 1,
  body: {
    first_name: 'John',
    last_name: 'Smith'
  }
)
puts response

response = client.search(
  index: 'my-index-000001',
  body: {
    query: {
      match: {
        full_name: {
          query: 'John Smith',
          operator: 'and'
        }
      }
    }
  }
)
puts response
PUT my-index-000001
{
  "mappings": {
    "properties": {
      "first_name": {
        "type": "text",
        "copy_to": "full_name" 
      },
      "last_name": {
        "type": "text",
        "copy_to": "full_name" 
      },
      "full_name": {
        "type": "text"
      }
    }
  }
}

PUT my-index-000001/_doc/1
{
  "first_name": "John",
  "last_name": "Smith"
}

GET my-index-000001/_search
{
  "query": {
    "match": {
      "full_name": { 
        "query": "John Smith",
        "operator": "and"
      }
    }
  }
}

first_namelast_name 字段的值将被复制到 full_name 字段。

仍然可以分别查询 first_namelast_name 字段以获取名字和姓氏,但可以查询 full_name 字段以获取名字和姓氏。

一些要点

  • 复制的是字段*值*,而不是词条(词条是分析过程的结果)。
  • 原始的 _source 字段不会被修改以显示复制的值。
  • 可以使用 "copy_to": [ "field_1", "field_2" ] 将相同的值复制到多个字段。
  • 您不能通过中间字段递归复制,例如,在 field_1 上使用 copy_to 复制到 field_2,并在 field_2 上使用 copy_to 复制到 field_3,期望索引到 field_1 最终会出现在 field_3 中,而是直接从原始字段复制到多个字段。
  • 如果目标字段在索引映射中不存在,则应用通常的 动态映射 行为。默认情况下,如果将 dynamic 设置为 true,则会将不存在的目标字段动态添加到索引映射中。如果将 dynamic 设置为 false,则不会将目标字段添加到索引映射中,并且不会复制该值。如果将 dynamic 设置为 strict,则复制到不存在的字段将导致错误。

对于值采用对象形式的字段类型,例如 date_range,*不支持* copy_to