2017-08-23 213 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

相關問題