Elasticsearch日期范围检查嵌套的日期范围数组

时间:2018-01-06 03:39:15

标签: elasticsearch nested nest

所有开发者,这是我在这里的第一个问题请忽略我的错误。我正在开展一个项目,我有一个预订列表。这个列表有开始和结束日期,对于elasticsearch我已经声明并将它们索引为嵌套

"Bookings":[{
    "StartDate":"2017-01-10T10:00:00+11:00",
    "EndDate":"2017-01-15T21:30:00+11:00"
  },{
    "StartDate":"2017-01-20T10:00:00+11:00",
    "EndDate":"2017-01-25T00:00:00+11:00"
  }]

但是当我尝试检查可用性时,结果不符合预期,这里是我正在运行的elasticsearch的json

{
  "from": 0,
  "size": 12,
  "_source": [
    "Id",
    "Bookings"
  ],
  "query": {
    "bool": {
      "filter": [
        {
          "nested": {
            "path": "Bookings",
            "query": {
              "bool": {
                "must_not": [
                  {
                    "bool": {
                      "must": [
                        {"range": {"Bookings.StartDate": {"gte": "2018-01-06T00:00:00+11:00"}}},
                        {"range": {"Bookings.EndDate": {"lte": "2018-01-09T00:00:00+11:00"}}}
                      ]
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
}

当搜索日期为06-01-2018(startDate)和09-01-2018(endDate)时,结果很好,但是当我将日期更改为06-01-2018(startDate)和11-01-2018(endDate)时)结果出错了但是根据嵌套逻辑,它应该给我一个预订,从10-01-2018到15-01-2018,因为endDate(11-01-2018)属于该范围。任何人都可以帮我修复逻辑以检查可用性,没有预订在搜索开始和结束日期范围内?

1 个答案:

答案 0 :(得分:0)

我最后在父对象中添加了一个额外的所有日期列表,即我在每次预订/取消时更新的BookingDates,以添加和删除日期。对于弹性搜索,我只是在列表日期落在搜索范围内时检查过滤器。

{
  "bool": {
    "must_not": [
      {
        "range": {
          "BookingDates": {
            "gte": "2018-01-16T00:00:00+11:00",
            "lte": "2018-01-20T00:00:00+11:00"
          }
        }
      }
    ]
  }
}

如果有人有更好的方法请分享,我正在分享我的逻辑,因为我没有找到这个/类似问题的答案。可能这可以帮助处于类似情况的人。