我有一些员工,正在寻找那些没有输入生日或生日早于1963-03-01的人。我有:
GET employees/_search
{
"query": {
"bool": {
"must_not": {
"exists": {
"field": "birthday"
}
},
"filter": {
"range": {"birthday": {"lte": 19630301}}
}
}
}
}
现在我有250名员工,没有一个生日字段,但是此查询返回0个结果。
最佳答案
您可以对此进行bool查询,并应出现。
第一个子句可以应用不带生日字段的文档检查,而第二个子句可以根据给定范围过滤文档。
使用should查询将充当逻辑OR运算符,并检索两者之一。
{
"query": {
"bool": {
"should": [
{
"bool": {
"must_not": [{ "exists": { "field": "birthday" } }]
}
},
{
"bool": {
"filter": [{ "range": {"birthday": { "lte": 19630301 }} }]
}
}
]
}
}
}
由于并非针对过滤器计算得分,因此您可能希望所有得分保持一致。您可以选择使用Constant Score Query,也可以在生日过滤的子句上添加一个附加查询,该查询使第一个子句中的must_not相反,如下所示:
{
"query": {
"bool": {
"should": [
{
"bool": {
"must_not": [{ "exists": { "field": "birthday" } }]
}
},
{
"bool": {
"must": [{ "exists": { "field": "birthday" } }],
"filter": [{ "range": {"birthday": { "lte": 19630301 }} }]
}
}
]
}
}
}
关于elasticsearch - 查找字段不存在或字段小于值的文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50402225/