我有一些员工,我正试图找到那些没有生日快乐或生日早于1963-03-01的人。我有:
GET employees/_search
{
"query": {
"bool": {
"must_not": {
"exists": {
"field": "birthday"
}
},
"filter": {
"range": {"birthday": {"lte": 19630301}}
}
}
}
}
现在我有250名员工,他们都没有生日字段,但此查询返回0结果。
答案 0 :(得分:1)
您可以尝试使用 should 出现的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 }} }]
}
}
]
}
}
}