elasticsearch - Elasticsearch 6.3 在关键字字段中使用空格查询并且不返回所有文档
问题描述
我有一个映射的休闲部分:
"name": {
"store": "true",
"type": "keyword"
}
这个查询:
{
"query":{
"query_string":{
"query":"+(name:John Doe)",
"fields":[
]
}
},
"aggregations":{
"name":{
"terms":{
"field":"name",
"size":10
}
}
}
}
该查询应该返回 100 多个结果,但它只返回几个。如果我像这样向 John Doe 添加引号:\"John Doe\",那么它会返回所有所需的结果。
我想知道为什么会这样。将字段映射为关键字以便整体分析 John Doe 并且不应该添加引号还不够吗?另外,为什么它会返回更少的没有引号的项目?
注意:在 ES 1.4 中,相同的查询似乎可以正常工作(尽管说实话不是相同的数据,并且它使用构面而不是聚合)。
解决方案
查询文档query string
明确指出:
如果该字段是一个
keyword
字段,分析器将创建一个单独的术语...
因此,您无需在搜索字符串中添加引号。相反,您需要正确编写查询。目前,您的查询尝试John
在字段中查找术语name
,并Doe
在所有其他字段中查找术语!因此,您必须通过以下方式之一重写您的查询:
为您的搜索词添加括号,以便查询解析器可以“理解”必须在
name
字段中找到所有单词:{ "query": { "query_string": { "query": "+(name:(John Doe))", "fields": [ ] } }, "aggregations": { "name": { "terms": { "field": "name", "size": 10 } } } }
fields
在数组中而不是在查询字符串中指定字段名称:{ "query": { "query_string": { "query": "+(John Doe)", "fields": [ "name" ] } }, "aggregations": { "name": { "terms": { "field": "name", "size": 10 } } } }
推荐阅读
- python - 如何使用 xtick.major.width 和 xtick.minor.widtch rcParams 键?
- c# - 如何在同一个项目中使用 2 个不同的数据库架构来组织 Entity Framework Core 迁移(代码优先)?
- kubernetes - 谷歌云:如何将 Kubernetes 集群移动到不同的区域?
- node.js - NodeJS - Apollo Server:文件上传流解析期间请求断开连接
- python - 为什么 df1= df 不在 python 中复制数据框?
- java - 为什么我的登录不起作用?春季安全
- ruby - 如何将 Ruby 脚本的输出捕获到 Powershell
- java - 在 Java Spring 中发生了具有 @OneToMany 关系的奇怪开始
- python - 尝试访问我的 Heroku 应用程序(Python/Flask)时出现“没有运行 Web 进程”错误
- android - 如何在android中同时淡入和淡出2个textview