Elasticsearch - 按日期范围过滤,其中日期可以使用过滤器上下文为空

时间:2017-03-23 16:51:42

标签: elasticsearch

我正在尝试过滤掉任何有"可用直到"过去的日期。但是,如果"可用直到" date为null,我仍然想返回结果。

以下是我需要的输出:

onClick="return confirm('Delete All Checked?');"<< 不应该返回

Available Until Date < today&lt;&lt; 应该返回

Available Until Date >= today&lt;&lt; 应该返回

我已经查看了以下其他堆栈溢出问题herehere,但是,我相信两者都在查询上下文中,而我需要使用过滤器上下文。

以下是我目前的代码。我如何修改它以允许使用过滤器上下文在&#34;可用直到&#34;中使用空值的结果?

Available Until Date is null

感谢您的帮助! :)

2 个答案:

答案 0 :(得分:0)

唯一的方法是使用bool/should查询来捕获

的约束
  • 要么没有AvailableUntil日期
  • AvailableUntil晚于今天

查询如下所示:

var baseQuery = {
    "size": 1000,
    "query": {
        "bool": {
            "minimum_should_match": 1,
            "should": [
              {
                "bool": {
                  "must_not": {
                    "exists": {
                      "field": "Product.AvailableUntil"
                    }
                  }
                }
              },
              {
                "range": {
                    "Product.AvailableUntil": {
                        "gte": "now"
                    }
                }
              }
            ]
        }
    }
};

答案 1 :(得分:0)

以下解决方案是我最终使用的。通过将bool子句嵌套在filter子句中的另一个bool子句中,我能够使用filter context实现我想要的输出。

var baseQuery = {
    "size": 1000,
    "query": {
        "bool": {
            "filter": [{
                "bool": {
                    "should": [{
                        "range": {
                            "Product.AvailableUntil": {
                                "gte": "now"
                            }
                        }
                    }, {
                        "bool": {
                            "must_not": {
                                "exists": {
                                    "field": "Product.AvailableUntil"
                                }
                            }
                        }
                    }]
                }
            }],
            "must_not": [],
            "should": [],
            "must": []
        }
    }
};