一尘不染

Elasticsearch日期范围交集

elasticsearch

我在elasticsearch中存储以下信息:

{ "timeslot_start_at" : "2013-02-01", "timeslot_end_at" : "2013-02-03" }

假设我还有另一个日期范围(例如,从用户输入中得出),我想搜索一个相交的时间范围。与此类似:确定两个日期范围是否重叠这概述了以下逻辑:

(StartDate1 <= EndDate2) and (StartDate2 <= EndDate1)

但是我不确定如何将其放入elasticsearch查询中,我会使用范围过滤器并且仅将“ to”值设置为,而将from留为空白吗?还是有一种更有效的方法?


阅读 471

收藏
2020-06-22

共1个答案

一尘不染

更新:现在可以使用在elasticsearch
v5.2中添加的date_range数据类型。对于elasticsearch的早期版本,以下解决方案仍然适用。

要测试交集,您应该使用布尔查询将两个范围查询合并为一个查询:

{
    "bool": {
        "must": [
            {
                "range": {
                    "timeslot_start_at": {
                        "lte": "2013-02-28"
                    }
                }
            },
            {
                "range": {
                    "timeslot_end_at": {
                        "gte": "2013-02-03"
                    }
                }
            }
        ]
    }
}
2020-06-22