Elasticsearch日期范围不得位于多个date_begin,date_end

时间:2015-12-05 17:41:10

标签: elasticsearch

我的应用中有check_incheck_out“d-m-Y”搜索字段。这些搜索在这些日期之间可用成员。 另一方面,会员可以编辑他们的日历,并可以将任何日期范围标记为标记为不可用的日历。 例如:Alice的日历。 这只是弹性的相关指数。

注意:没有多个搜索过滤器,我只是编写它们来显示几种情况。对于此搜索,不得通过弹性搜索找到Alice。

Example Searches:
 check_in  "04-12-2015"
 check_out "07-12-2015"

 check_in  "08-12-2015"
 check_out "11-12-2015"

 check_in  "09-12-2015"
 check_out "15-12-2015"

 check_in  "05-12-2015"
 check_out "11-12-2015"


"Alice's Not available Calendar" : [
    {
        "date_begin" : "05-12-2015",
        "date_end'   : '09-12-2015"
    },
    {
        "date_begin" : "01-01-2016",
        "date_end'   : '07-02-2016"
    },
    {
        "date_begin" : "09-04-2016",
        "date_end'   : '11-04-2016"
    },
    {
        "date_begin" : "17-04-2016",
        "date_end'   : '21-04-2016"
    }
]

我应该检查一下这些断言:

{check_in} lte {date_begin} and
{check_out} lte {date_end}

check_in
    date_begin
check_out
    date_end


{check_in} gte {date_begin} and
{check_out} lte {date_end}    

    date_begin
check_in
check_out
    date_end



{check_in} lte {date_begin} and
{check_out} gte {date_end}    

check_in
    date_begin
    date_end
check_out



{check_in} gte {date_begin} and
{check_out} gte {date_end}

    date_begin
check_in
    date_end
check_out

对于这些信息,我应该如何以期望的方式将查询发送到过滤器?我无法想象应该如何以适当的方式。

这样的东西,但我怎么能写出正确的语法。

{
"bool" : {
    "must_not" : {
        "range" : {
            "date_begin" : { "lte" : "{check_in}" }
        }
    },
    <---- AND ----->
    "must_not" : {
        "range" : {
            "date_end" : { "lte" : "{check_out}" }
        }
    },
    <---- OR ----->
    "must_not" : {
        "range" : {
            "date_begin" : { "gte" : "{check_in}" }
        }
    },
    <---- AND ----->
    "must_not" : {
        "range" : {
            "date_end" : { "lte" : "{check_out}" }
        }
    },
    <---- OR ----->
    "must_not" : {
        "range" : {
            "date_begin" : { "lte" : "{check_in}" }
        }
    },
    <---- AND ----->
    "must_not" : {
        "range" : {
            "date_end" : { "gte" : "{check_out}" }
        }
    },
    <---- OR ----->
    "must_not" : {
        "range" : {
            "date_begin" : { "gte" : "{check_in}" }
        }
    },
    <---- AND ----->
    "must_not" : {
        "range" : {
            "date_end" : { "gte" : "{check_out}" }
        }
    },
}

}

1 个答案:

答案 0 :(得分:0)

如果我理解正确,搜索应该返回具有以下条件的成员。

1)date_begin应该大于check_incheck_out

2)date_end应该小于check_incheck_out

让我们说用户输入 2014-02-19 作为check_in日期和 2014-02-20 作为check_out日期然后我认为关注查询将满足您的所有要求

{
  "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "must": [
              {
                "range": {
                  "date_begin": {
                    "gt": "2014-02-19"
                  }
                }
              },
              {
                "range": {
                  "date_begin": {
                    "gt": "2014-02-20"
                  }
                }
              }
            ]
          }
        },
        {
          "bool": {
            "must": [
              {
                "range": {
                  "date_end": {
                    "lt": "2014-02-19"
                  }
                }
              },
              {
                "range": {
                  "date_end": {
                    "lt": "2014-02-20"
                  }
                }
              }
            ]
          }
        }
      ]
    }
  }
}

这将为您提供所有可用的会员。