我试图将两个字段复制到第三个字段,该字段应该具有“关键字”类型(因为我希望能够通过它进行聚合,而不需要执行全文搜索)
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_name
的类型是 text
,那么它按预期工作并在文档中描述:
https://www.elastic.co/guide/en/elasticsearch/reference/current/copy-to.html
是否无法复制到关键字类型字段?
1 回答
问题是您使用
match
查询 - 当您索引文档时,您使用的关键字类型根据ES documentation是"...only searchable by their exact value."但是,当您查询该字段时,您使用的是
match
查询,该查询正在使用标准分析器,除了其他内容之外,还会使用较低的外壳,导致您的术语不匹配 .在这种情况下,我可以想到几个选项:
将字段类型更改为
text
,它将执行与match
查询相同的分析 .使用自定义分析器创建自定义字段类型,该分析器将执行更低的外壳
一次不要查询多个术语并使用
term
查询而不是match