首页 > 解决方案 > Elasticsearch copy_to 不适用于关键字字段

问题描述

我正在尝试将两个字段复制到第三个字段,该字段的类型应为“关键字”(因为我希望能够通过它进行聚合,并且不需要执行全文搜索)

PUT /test/_mapping/_doc
{
  "properties": {
    "first": {
      "copy_to": "full_name",
      "type": "keyword"
    },
    "last": {
      "copy_to": "full_name",
      "type": "keyword"
    },
    "full_name": {
      "type": "keyword"
    }
  }
}

然后我发布一个新文件:

POST /test/_doc
{
  "first": "Bar",
  "last": "Foo"
}

并使用复合字段查询它full_name

GET /test2/_search
{
  "query": {
    "match": {
      "full_name": "Bar Foo" 
    }
  }
}

并且没有返回任何命中。

如果复合字段的类型full_nametext那么它按预期工作并在文档中描述:

https://www.elastic.co/guide/en/elasticsearch/reference/current/copy-to.html

不能复制到关键字类型字段吗?

标签: elasticsearch

解决方案


问题是您使用match查询 - 当您为文档编制索引时,您使用的关键字类型根据ES 文档是“......只能按其确切值搜索”。

但是,当您查询该字段时,您使用match的是使用标准分析器的查询,除其他外,它还会使用小写字母,这会导致您的术语不匹配任何内容。

在这种情况下,我能想到的选择很少:

  1. 更改text将执行与查询相同的分析的字段类型match
  2. 使用自定义分析器创建自定义字段类型,该分析器将执行小写
  3. 一次不要查询多个词,并使用term查询而不是match

推荐阅读