Elasticsearch - Bool过滤器:日期范围OR字段可以是nul

时间:2016-08-09 07:19:28

标签: elasticsearch

我试图在ElasticSearch中创建 bool过滤器,检查start_dateend_date与今天相比。如果start_dateend_date为空,则仍应返回结果。

例如,今天是2016-08-09。

  • 第1项:start_date:2016-08-04 end_date:2016-08-08 不应退回
  • 第2项:start_date:2016-08-08 end_date:2016-08-12 应该退回
  • 第3项:start_date:null end_date:null 应该返回

似乎无法使用我当前的代码:

POST _search
{
"query":{
    "filtered": {
        "query": {
            "match_all": {}
        },
        "filter" : {
            "bool": {
                "must": [{
                    "range": {
                        "start_date": {"lte": "2016-08-09"}         
                    }
                },
                {
                    "range": {
                        "end_date": {"gte": "2016-08-09"}     
                    }
                }],
                "should": [{
                    "missing": {
                        "field": "start_date"         
                    }
                },
                {
                    "missing": {
                        "field": "end_date"      
                    }
                }]
            }
        }
    }
}
}

2 个答案:

答案 0 :(得分:2)

你可能需要这样的东西,即:

  • start_date必须为null或今天之前
  • end_date必须为null或今天之后

修订查询:

POST _search
{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must": [
            {
              "bool": {
                "should": [
                  {
                    "range": {
                      "start_date": {
                        "lte": "now"
                      }
                    }
                  },
                  {
                    "missing": {
                      "field": "start_date"
                    }
                  }
                ]
              }
            },
            {
              "bool": {
                "should": [
                  {
                    "range": {
                      "end_date": {
                        "gte": "now"
                      }
                    }
                  },
                  {
                    "missing": {
                      "field": "end_date"
                    }
                  }
                ]
              }
            }
          ]
        }
      }
    }
  }
}

答案 1 :(得分:0)

看起来您需要以下查询:

(start_date <= date AND date <= end_date) OR (start_date == null) OR (end_date == null)

按照elasticsearch documentation的示例,我将编写以下条款:

"bool": {
    "should": [
        {"bool": 
            "must": [{
                "range": {
                    "start_date": {
                        "lte": "2016-08-09"
                    }
                }
            },
            {
                "range": {
                    "end_date": {
                        "gte": "2016-08-09"
                    }
                }
            }]
        },
        "missing": {
            "field": "start_date"
        },
        "missing": {
            "field": "end_date"
        }
    ]
}

如果它不能完全按照书面形式工作,我会尝试通过执行查询来查看should子句的每个部分是否有效(即日期在一个范围内,start_date不存在,end_date不存在)用这些单件。如果所有这些都有效,那么在should子句中组合它们也应该有用。