簡體   English   中英

Elasticsearch遍歷嵌套對象中的范圍查詢結果

[英]Elasticsearch iterate over range query result in nested object

我有一個elasticsearch索引,其中有一個嵌套的對象,稱為availability,其中有一個日期和一個布爾字段,映射模式如下

    {
       "hotel_nested" : {
        "mappings" : {
          "doc" : {
            "properties" : {
               "amenities" : {
                   "type" : "text",
                   "fields" : {
                   "keyword" : {
                        "type" : "keyword",
                        "ignore_above" : 256
                         }     
                     }
               },
              "availability" : {
                    "type" : "nested",
                     "properties" : {
                            "date" : {
                               "type" : "date",
                               "fields" : {
                               "keyword" : {
                                 "type" : "keyword",
                                 "ignore_above" : 256
                               }
                           },
                            "format" : "MM/dd/yyyy HH:mm:ss||MM/dd/yyyy||epoch_millis"
          },
                          "status" : {
                              "type" : "boolean"
                            }
        }
      },
      "dailyRate" : {
        "type" : "text",
        "fields" : {
          "keyword" : {
            "type" : "keyword",
            "ignore_above" : 256
          }
        }
      },
      "destination" : {
        "type" : "text",
        "fields" : {
          "keyword" : {
            "type" : "keyword",
            "ignore_above" : 256
          }
        }
      },
      "hotelName" : {
        "type" : "text",
        "fields" : {
          "keyword" : {
            "type" : "keyword",
            "ignore_above" : 256
          }
        }
      },
      "location" : {
        "properties" : {
          "lat" : {
            "type" : "float"
          },
          "lon" : {
            "type" : "float"
          }
        }
      },
      "maxOccupancy" : {
        "type" : "long"
      },
      "propertyType" : {
        "type" : "text",
        "fields" : {
          "keyword" : {
            "type" : "keyword",
            "ignore_above" : 256
          }
        }
      },
      "roomType" : {
        "type" : "text",
        "fields" : {
          "keyword" : {
            "type" : "keyword",
            "ignore_above" : 256
          }
        }
      },
      "starRating" : {
        "type" : "float"
         }
       }
     }
   }
 }
}

這是對象之一

    {
    "_index" : "hotel_nested",
    "_type" : "doc",
    "_id" : "14",
    "_score" : 1.0,
    "_source" : {
      "roomType" : "Executive",
      "destination" : "Albuquerque",
      "maxOccupancy" : 4,
      "starRating" : 6.8,
      "hotelName" : "Lotte Hotel Seoul",
      "amenities" : [
        "Spa",
        "Internet",
        "Free parking",
        "Air conditioning",
        "Laundry Service",
        "Business Services"
      ],
      "location" : {
        "lat" : 56.76755,
        "lon" : -110.75792
      },
      "propertyType" : "Hotel",
      "dailyRate" : "$178.96",
      "availability" : [
        {
          "date" : "10/1/2017",
          "status" : true
        },
        {
          "date" : "10/2/2017",
          "status" : true
        },
        {
          "date" : "10/3/2017",
          "status" : true
        },
        {
          "date" : "10/4/2017",
          "status" : false
        },
        {
          "date" : "10/5/2017",
          "status" : false
        },
        {
          "date" : "10/6/2017",
          "status" : false
        },
        {
          "date" : "10/7/2017",
          "status" : true
        },
        {
          "date" : "10/8/2017",
          "status" : true
        },
        {
          "date" : "10/9/2017",
          "status" : false
        },
        {
          "date" : "10/10/2017",
          "status" : false
        },
        {
          "date" : "10/11/2017",
          "status" : true
        },
        {
          "date" : "10/12/2017",
          "status" : false
        },
        {
          "date" : "10/13/2017",
          "status" : false
        },
        {
          "date" : "10/14/2017",
          "status" : true
        },
        {
          "date" : "10/15/2017",
          "status" : true
        },
        {
          "date" : "10/16/2017",
          "status" : true
        },
        {
          "date" : "10/17/2017",
          "status" : false
        },
        {
          "date" : "10/18/2017",
          "status" : true
        },
        {
          "date" : "10/19/2017",
          "status" : false
        },
        {
          "date" : "10/20/2017",
          "status" : true
        },
        {
          "date" : "10/21/2017",
          "status" : false
        },
        {
          "date" : "10/22/2017",
          "status" : true
        },
        {
          "date" : "10/23/2017",
          "status" : true
        },
        {
          "date" : "10/24/2017",
          "status" : true
        },
        {
          "date" : "10/25/2017",
          "status" : false
        },
        {
          "date" : "10/26/2017",
          "status" : false
        },
        {
          "date" : "10/27/2017",
          "status" : false
        },
        {
          "date" : "10/28/2017",
          "status" : true
        },
        {
          "date" : "10/29/2017",
          "status" : true
        },
        {
          "date" : "10/30/2017",
          "status" : true
        },
        {
          "date" : "10/31/2017",
          "status" : true
        },
        {
          "date" : "11/1/2017",
          "status" : true
        },
        {
          "date" : "11/2/2017",
          "status" : false
        },
        {
          "date" : "11/3/2017",
          "status" : false
        },
        {
          "date" : "11/4/2017",
          "status" : false
        },
        {
          "date" : "11/5/2017",
          "status" : false
        },
        {
          "date" : "11/6/2017",
          "status" : true
        },
        {
          "date" : "11/7/2017",
          "status" : false
        },
        {
          "date" : "11/8/2017",
          "status" : false
        },
        {
          "date" : "11/9/2017",
          "status" : false
        },
        {
          "date" : "11/10/2017",
          "status" : false
        },
        {
          "date" : "11/11/2017",
          "status" : false
        },
        {
          "date" : "11/12/2017",
          "status" : false
        },
        {
          "date" : "11/13/2017",
          "status" : false
        },
        {
          "date" : "11/14/2017",
          "status" : true
        },
        {
          "date" : "11/15/2017",
          "status" : true
        },
        {
          "date" : "11/16/2017",
          "status" : false
        },
        {
          "date" : "11/17/2017",
          "status" : true
        },
        {
          "date" : "11/18/2017",
          "status" : false
        },
        {
          "date" : "11/19/2017",
          "status" : true
        },
        {
          "date" : "11/20/2017",
          "status" : true
        },
        {
          "date" : "11/21/2017",
          "status" : true
        },
        {
          "date" : "11/22/2017",
          "status" : true
        },
        {
          "date" : "11/23/2017",
          "status" : false
        },
        {
          "date" : "11/24/2017",
          "status" : false
        },
        {
          "date" : "11/25/2017",
          "status" : false
        },
        {
          "date" : "11/26/2017",
          "status" : true
        },
        {
          "date" : "11/27/2017",
          "status" : true
        },
        {
          "date" : "11/28/2017",
          "status" : false
        },
        {
          "date" : "11/29/2017",
          "status" : false
        },
        {
          "date" : "11/30/2017",
          "status" : false
        },
        {
          "date" : "12/1/2017",
          "status" : true
        },
        {
          "date" : "12/2/2017",
          "status" : true
        },
        {
          "date" : "12/3/2017",
          "status" : true
        },
        {
          "date" : "12/4/2017",
          "status" : true
        },
        {
          "date" : "12/5/2017",
          "status" : true
        },
        {
          "date" : "12/6/2017",
          "status" : true
        },
        {
          "date" : "12/7/2017",
          "status" : false
        },
        {
          "date" : "12/8/2017",
          "status" : false
        },
        {
          "date" : "12/9/2017",
          "status" : true
        },
        {
          "date" : "12/10/2017",
          "status" : false
        },
        {
          "date" : "12/11/2017",
          "status" : true
        },
        {
          "date" : "12/12/2017",
          "status" : false
        },
        {
          "date" : "12/13/2017",
          "status" : true
        },
        {
          "date" : "12/14/2017",
          "status" : true
        },
        {
          "date" : "12/15/2017",
          "status" : true
        },
        {
          "date" : "12/16/2017",
          "status" : false
        },
        {
          "date" : "12/17/2017",
          "status" : true
        },
        {
          "date" : "12/18/2017",
          "status" : true
        },
        {
          "date" : "12/19/2017",
          "status" : false
        },
        {
          "date" : "12/20/2017",
          "status" : true
        },
        {
          "date" : "12/21/2017",
          "status" : true
        },
        {
          "date" : "12/22/2017",
          "status" : false
        },
        {
          "date" : "12/23/2017",
          "status" : false
        },
        {
          "date" : "12/24/2017",
          "status" : false
        },
        {
          "date" : "12/25/2017",
          "status" : false
        },
        {
          "date" : "12/26/2017",
          "status" : false
        },
        {
          "date" : "12/27/2017",
          "status" : false
        },
        {
          "date" : "12/28/2017",
          "status" : false
        },
        {
          "date" : "12/29/2017",
          "status" : false
        },
        {
          "date" : "12/30/2017",
          "status" : true
        },
        {
          "date" : "12/31/2017",
          "status" : true
        }
      ]
    }
  }

我的問題是,我想在兩個日期之間進行搜索,以查明兩個日期之間所有日期的酒店空房狀態是否為真,並且在粗略水平上也與城市名稱匹配,我還有其他搜索條件,我認為我可以處理,但是找到兩個日期之間所有日期的真實狀態困擾着我

例如,搜索查詢參數城市Albuquerque,開始日期10/22/2017和結束日期10/24/2017

我創建了一個查詢,該查詢給出了不想要的結果,我的查詢是

        {
         "query": {
         "bool": {
            "must":[ 
        {
                 "match": {
                      "destination": { 
                            "query":    "Albuquerque" ,
                            "operator": "and"
                         }
                  }
            }

        ],
        "filter": {
              "bool": { 
                 "must": [  {
                "nested": {
                    "path": "availability", 
                        "query": {
                           "bool": {
                             "must": [ 
                                  {
                                 "range": {
                                     "availability.date":{ "gte": "10/22/2017",
                                        "lte":"10/24/2017"}
                }
              },
              {
                "term": {
                  "availability.status": "true"
                }
              }
            ]
          }
        }
      }
    }
            ]
      }
     }
   }
 }
 }

該查詢的第一個匹配項是

        {
            "_index": "hotel_nested",
            "_type": "doc",
            "_id": "305",
            "_score": 4.815987,
            "_source": {
                "roomType": "Executive",
                "destination": "Albuquerque",
                "maxOccupancy": 2,
                "starRating": 4.2,
                "hotelName": "Sheraton San Diego Hotel & Marina",
                "amenities": [
                    "Kitchen",
                    "Air conditioning",
                    "Laundry Service",
                    "Business Services",
                    "Free parking",
                    "Spa"
                ],
                "location": {
                    "lat": 54.92887,
                    "lon": -101.31256
                },
                "propertyType": "Hotel",
                "dailyRate": "$462.59",
                "availability": [
                    {
                        "date": "10/1/2017",
                        "status": false
                    },
                    {
                        "date": "10/2/2017",
                        "status": true
                    },
                    {
                        "date": "10/3/2017",
                        "status": false
                    },
                    {
                        "date": "10/4/2017",
                        "status": true
                    },
                    {
                        "date": "10/5/2017",
                        "status": true
                    },
                    {
                        "date": "10/6/2017",
                        "status": true
                    },
                    {
                        "date": "10/7/2017",
                        "status": true
                    },
                    {
                        "date": "10/8/2017",
                        "status": false
                    },
                    {
                        "date": "10/9/2017",
                        "status": false
                    },
                    {
                        "date": "10/10/2017",
                        "status": true
                    },
                    {
                        "date": "10/11/2017",
                        "status": true
                    },
                    {
                        "date": "10/12/2017",
                        "status": false
                    },
                    {
                        "date": "10/13/2017",
                        "status": true
                    },
                    {
                        "date": "10/14/2017",
                        "status": false
                    },
                    {
                        "date": "10/15/2017",
                        "status": true
                    },
                    {
                        "date": "10/16/2017",
                        "status": false
                    },
                    {
                        "date": "10/17/2017",
                        "status": true
                    },
                    {
                        "date": "10/18/2017",
                        "status": false
                    },
                    {
                        "date": "10/19/2017",
                        "status": false
                    },
                    {
                        "date": "10/20/2017",
                        "status": true
                    },
                    {
                        "date": "10/21/2017",
                        "status": true
                    },
                    {
                        "date": "10/22/2017",
                        "status": true
                    },
                    {
                        "date": "10/23/2017",
                        "status": false
                    },
                    {
                        "date": "10/24/2017",
                        "status": false
                    },
                    {
                        "date": "10/25/2017",
                        "status": false
                    },
                    {
                        "date": "10/26/2017",
                        "status": true
                    },
                    {
                        "date": "10/27/2017",
                        "status": true
                    },
                    {
                        "date": "10/28/2017",
                        "status": false
                    },
                    {
                        "date": "10/29/2017",
                        "status": true
                    },
                    {
                        "date": "10/30/2017",
                        "status": false
                    },
                    {
                        "date": "10/31/2017",
                        "status": false
                    },
                    {
                        "date": "11/1/2017",
                        "status": false
                    },
                    {
                        "date": "11/2/2017",
                        "status": false
                    },
                    {
                        "date": "11/3/2017",
                        "status": false
                    },
                    {
                        "date": "11/4/2017",
                        "status": false
                    },
                    {
                        "date": "11/5/2017",
                        "status": false
                    },
                    {
                        "date": "11/6/2017",
                        "status": true
                    },
                    {
                        "date": "11/7/2017",
                        "status": false
                    },
                    {
                        "date": "11/8/2017",
                        "status": true
                    },
                    {
                        "date": "11/9/2017",
                        "status": true
                    },
                    {
                        "date": "11/10/2017",
                        "status": true
                    },
                    {
                        "date": "11/11/2017",
                        "status": true
                    },
                    {
                        "date": "11/12/2017",
                        "status": false
                    },
                    {
                        "date": "11/13/2017",
                        "status": true
                    },
                    {
                        "date": "11/14/2017",
                        "status": false
                    },
                    {
                        "date": "11/15/2017",
                        "status": true
                    },
                    {
                        "date": "11/16/2017",
                        "status": true
                    },
                    {
                        "date": "11/17/2017",
                        "status": false
                    },
                    {
                        "date": "11/18/2017",
                        "status": true
                    },
                    {
                        "date": "11/19/2017",
                        "status": false
                    },
                    {
                        "date": "11/20/2017",
                        "status": true
                    },
                    {
                        "date": "11/21/2017",
                        "status": false
                    },
                    {
                        "date": "11/22/2017",
                        "status": false
                    },
                    {
                        "date": "11/23/2017",
                        "status": false
                    },
                    {
                        "date": "11/24/2017",
                        "status": false
                    },
                    {
                        "date": "11/25/2017",
                        "status": false
                    },
                    {
                        "date": "11/26/2017",
                        "status": false
                    },
                    {
                        "date": "11/27/2017",
                        "status": false
                    },
                    {
                        "date": "11/28/2017",
                        "status": false
                    },
                    {
                        "date": "11/29/2017",
                        "status": false
                    },
                    {
                        "date": "11/30/2017",
                        "status": true
                    },
                    {
                        "date": "12/1/2017",
                        "status": false
                    },
                    {
                        "date": "12/2/2017",
                        "status": false
                    },
                    {
                        "date": "12/3/2017",
                        "status": false
                    },
                    {
                        "date": "12/4/2017",
                        "status": true
                    },
                    {
                        "date": "12/5/2017",
                        "status": true
                    },
                    {
                        "date": "12/6/2017",
                        "status": false
                    },
                    {
                        "date": "12/7/2017",
                        "status": true
                    },
                    {
                        "date": "12/8/2017",
                        "status": false
                    },
                    {
                        "date": "12/9/2017",
                        "status": true
                    },
                    {
                        "date": "12/10/2017",
                        "status": true
                    },
                    {
                        "date": "12/11/2017",
                        "status": false
                    },
                    {
                        "date": "12/12/2017",
                        "status": true
                    },
                    {
                        "date": "12/13/2017",
                        "status": false
                    },
                    {
                        "date": "12/14/2017",
                        "status": true
                    },
                    {
                        "date": "12/15/2017",
                        "status": false
                    },
                    {
                        "date": "12/16/2017",
                        "status": true
                    },
                    {
                        "date": "12/17/2017",
                        "status": true
                    },
                    {
                        "date": "12/18/2017",
                        "status": false
                    },
                    {
                        "date": "12/19/2017",
                        "status": false
                    },
                    {
                        "date": "12/20/2017",
                        "status": false
                    },
                    {
                        "date": "12/21/2017",
                        "status": true
                    },
                    {
                        "date": "12/22/2017",
                        "status": true
                    },
                    {
                        "date": "12/23/2017",
                        "status": false
                    },
                    {
                        "date": "12/24/2017",
                        "status": false
                    },
                    {
                        "date": "12/25/2017",
                        "status": true
                    },
                    {
                        "date": "12/26/2017",
                        "status": false
                    },
                    {
                        "date": "12/27/2017",
                        "status": true
                    },
                    {
                        "date": "12/28/2017",
                        "status": false
                    },
                    {
                        "date": "12/29/2017",
                        "status": false
                    },
                    {
                        "date": "12/30/2017",
                        "status": true
                    },
                    {
                        "date": "12/31/2017",
                        "status": false
                    }
                ]
            }
        }

在日期10/23/2017和10/24/2017的此命中狀態為false有人可以指導我正確的方向,或者可以提供示例搜索查詢來解決此問題

您需要將嵌套查詢放在must子句下。 在嵌套查詢的底部添加inner_hits鍵,並在頭部啟用特定的_source字段(因為我們不在乎與嵌套查詢不匹配的其余子文檔),如下所示:

{
  "_source": [
    "hotelName",
    "dailyRate"
  ],
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "destination": {
              "query": "Albuquerque",
              "operator": "and"
            }
          }
        },
        {
          "nested": {
            "path": "availability",
            "query": {
              "bool": {
                "must": [
                  {
                    "range": {
                      "availability.date": {
                        "gte": "10/22/2017",
                        "lte": "10/24/2017"
                      }
                    }
                  },
                  {
                    "term": {
                      "availability.status": "true"
                    }
                  }
                ]
              }
            },
            "inner_hits": {
              "size": 10
            }
          }
        }
      ]
    }
  }
}

請注意,現在您將僅獲得符合條件的嵌套文檔,例如,對於您的示例,結果將是:

{
  "_index": "hotel_nested",
  "_type": "doc",
  "_id": "305",
  "_score": 4.815987,
  "_source": {
    "hotelName": "Sheraton San Diego Hotel & Marina",
    "dailyRate": "$462.59"
  },
  "inner_hits": {
    "availability": {
      "hits": {
        "total": 1,
        "hits": [
          {
            "date": "10/22/2017",
            "status": true
          }
        ]
      }
    }
  }
}

因此,現在,您必須檢查10月22-24范圍內的所有日期是否都存在。

一種快捷方式是標記"inner_hits":{"size":0}然后查看結果並檢查inner_hits的數量inner_hits等於10月22-24天內的天數:

"inner_hits"."availability"."hits"."total" == 3

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM