我有一个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
}
]
}
}
我的问题是,我想在两个日期之间进行搜索,并查看两个日期之间所有日期的酒店可用状态是否为真,并且还与原始级别的城市名称相匹配,我还有其他标准可以搜索哪个我想我可以处理,但找到两个日期之间的所有日期的真实状态是困扰我
例如搜索查询参数city 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 有人可以指导我正确的方向或可能提供一个示例搜索查询来解决这个问题
答案 0 :(得分:0)
您需要将嵌套查询放在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
的数量是否等于10月份22-24天的天数:
"inner_hits"."availability"."hits"."total" == 3