2017-08-23 169 views
0

我试图创建一个查询,该查询返回在该日期(或日期范围)内没有保留或根本没有保留的可用产品。这让我疯狂。查询使用开始日期和结束日期获取可用日期

这是我当前的映射索引设置:

{ 
    "development_product_instances" : { 
    "aliases" : { }, 
    "mappings" : { 
     "product_instance" : { 
     "properties" : { 
      "reservations" : { 
      "type" : "nested", 
      "properties" : { 
       "end_date" : { 
       "type" : "date", 
       "format" : "yyyy-MM-dd" 
       }, 
       "start_date" : { 
       "type" : "date", 
       "format" : "yyyy-MM-dd" 
       } 
      } 
      } 
     } 
     } 
    }, 
    "settings" : { 
     "index" : { 
     "creation_date" : "1503327829680", 
     "number_of_shards" : "5", 
     "number_of_replicas" : "1", 
     "uuid" : "9b9BhF-ITta2dlCKRLrnfA", 
     "version" : { 
      "created" : "2040499" 
     } 
     } 
    }, 
    "warmers" : { } 
    } 
} 

和查询:

{ 
    bool: { 
     should: [ 
     { 
      nested: { 
      path: "reservations", 
      filter: { 
       bool: { 
       must_not: [ 
        { 
        range: 
         { 
         "reservations.start_date": 
         { 
          gte: start_date, 
          lte: end_date 
         } 
         } 
        }, 
        { 
        range: 
         { 
         "reservations.end_date": 
         { 
          gte: start_date, 
          lt: end_date 
         } 
         } 
        } 
       ] 
       } 
      } 
      } 
     }, 
     { 
      not: { 
      nested: { 
       path: "reservations", 
       filter: { 
       match_all: {} 
       } 
      } 
      } 
     } 
     ] 
    } 
    } 

当有一个以上的预订将返回所有。

我希望有人能看到那里的bug。也许我在更大的图景中错过了一些东西。

回答

1

您的问题是must_notnested查询中。这意味着如果它匹配嵌套保留的任何,则父文档匹配。因此,当有多个预订时,除非您查询的范围重叠全部现有预订,否则您会得到一个匹配。你可以像这样改写它(注意,这个查询在预订为空时也匹配):

{ 
    "query": { 
    "bool": { 
     "must_not": { 
     "nested": { 
      "path": "reservations", 
      "query": { 
      "bool": { 
       "should": [ 
       { 
        "range": { 
        "reservations.start_date": { 
         "gte": start_date, 
         "lt": end_date 
        } 
        } 
       }, 
       { 
        "range": { 
        "reservations.end_date": { 
         "gte": start_date, 
         "lt": end_date 
        } 
        } 
       }, 
       { 
        "bool": { 
        "must": [ 
         { 
         "range": { 
          "reservations.start_date": { 
          "lt": start_date 
          } 
         } 
         }, 
         { 
         "range": { 
          "reservations.end_date": { 
          "gt": end_date 
          } 
         } 
         } 
        ] 
        } 
       } 
       ] 
      } 
      } 
     } 
     } 
    } 
    } 
} 
+0

我刚刚意识到如果我有一个保留让我们说2017-09-10到2017-09-12和我查询从2017年9月11日至2017年9月11日的可用性,它说可用(即没有保留),但有一个。有任何想法吗?基本上我需要相当于SQL:WHERE start_date <= [ENDDATE] AND end_date> = [STARTDATE]正确吗? – Oliver

+1

你是对的,对不起!我已经更新了该案件的答案。我怀疑有一个更简洁的查询 - 我会再次更新,如果我想到它。 – dshockley

+0

看起来不错!非常感谢很多! – Oliver

相关问题