elasticsearch - 查找字段不存在或字段小于值的文档
问题描述
我有一些员工,正在努力寻找那些没有输入生日或生日早于 1963-03-01 的人。我有:
GET employees/_search
{
"query": {
"bool": {
"must_not": {
"exists": {
"field": "birthday"
}
},
"filter": {
"range": {"birthday": {"lte": 19630301}}
}
}
}
}
现在我有 250 名员工,他们都没有生日字段,但此查询返回 0 个结果。
解决方案
您可以为此尝试使用应该出现的布尔查询。
第一个子句可以对没有生日字段的文档进行检查,而第二个子句可以根据您给定的范围过滤文档。
使用 should 查询将充当逻辑 OR 运算符并检索两者中的任何一个。
{
"query": {
"bool": {
"should": [
{
"bool": {
"must_not": [{ "exists": { "field": "birthday" } }]
}
},
{
"bool": {
"filter": [{ "range": {"birthday": { "lte": 19630301 }} }]
}
}
]
}
}
}
由于没有为过滤器计算分数,因此您可能希望使所有分数保持一致。您可以选择使用恒定分数查询,或者您可以在生日过滤子句上添加一个额外的查询,该子句与第一个子句中的must_not 相反,如下所示:
{
"query": {
"bool": {
"should": [
{
"bool": {
"must_not": [{ "exists": { "field": "birthday" } }]
}
},
{
"bool": {
"must": [{ "exists": { "field": "birthday" } }],
"filter": [{ "range": {"birthday": { "lte": 19630301 }} }]
}
}
]
}
}
}
推荐阅读
- android - 为什么 LiveData 很慢
- ios - iOS 恢复自动续订订阅
- node.js - AWS lambda nodejs函数不使用accessKeyId和secretAccessKey?
- swift - 具有节标题的 IGListCollectionsVeiw 中单元格的自动大小不起作用
- php - php减法给出错误答案
- c# - 从字符串中查找有效的文本出现
- linux - 查找在某个文件之前修改过的文件
- reactjs - 类型检查道具时如何指定孩子的长度?
- arrays - 如何在 Swift 中将“图像数组保存为照片库中的连拍图像”
- php - 带有 php:7.1-fpm 的 Docker 镜像的 GD 库