elasticsearch - 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_name
是text
那么它按预期工作并在文档中描述:
https://www.elastic.co/guide/en/elasticsearch/reference/current/copy-to.html
不能复制到关键字类型字段吗?
解决方案
问题是您使用match
查询 - 当您为文档编制索引时,您使用的关键字类型根据ES 文档是“......只能按其确切值搜索”。
但是,当您查询该字段时,您使用match
的是使用标准分析器的查询,除其他外,它还会使用小写字母,这会导致您的术语不匹配任何内容。
在这种情况下,我能想到的选择很少:
- 更改
text
将执行与查询相同的分析的字段类型match
。 - 使用自定义分析器创建自定义字段类型,该分析器将执行小写
- 一次不要查询多个词,并使用
term
查询而不是match
推荐阅读
- php - 如何将 JQUERY 函数添加到 phpfox?
- angular - 在页面刷新时保留传递的路由数据
- r - 缺少双引号会导致 Shiny 中的 URL 参数解析错误
- c# - 在 .NET Core 中侦听服务器发送的事件
- python - 在 django 中创建下拉按钮
- oracle - 分类数据(如下拉数据)表格的正确设计
- html - 如何将输入数据从 html 表单发送到外部 API?
- r - 调试自定义库安装失败
- python - RuntimeError: DataLoader worker (pid 2378) 被信号杀死:Killed
- node.js - 从其他控制器从 mongodb 获取数据时获取未定义结果