我计划在 elasticsearch 中存储数百万套 airbnb 类型的公寓。whereavailabilty
是一个包含nested
对象的数组(availability
type 是nested
)。并且这些对象中的每一个都有日期范围,其中该公寓可用。
apartments = [
{
"_id": "kjty873yhekrg789e7r0n87e",
"first_available_date": "2016-06-21",
"availability": [
{
"start": "2016-06-21",
"end": "2016-08-01"
},
{
"start": "2016-08-20",
"end": "2016-08-28"
},
{
"start": "2016-10-03",
"end": "2016-11-02"
},
{ //This means it is available only for one day.
"start": "2016-11-13",
"end": "2016-11-13"
},
{
"start": "2016-11-28",
"end": "2017-01-14"
}
],
"apartment_metadata1": 56456,
"apartment_metadata2": 8989,
"status": "active"
},
{
"_id": "hgk87783iii86937jh",
"first_available_date": "2016-06-09",
"availability": [
{
"start": "2016-06-09",
"end": "2016-07-02"
},
{
"start": "2016-07-21",
"end": "2016-12-19"
},
{
"start": "2016-12-12",
"end": "2017-07-02"
}
],
"apartment_metadata1": 23534,
"apartment_metadata2": 24377,
"status": "active"
}
]
我想搜索在特定日期范围内可用的公寓(比如2016-08-20 to 2016-12-12
)。该范围应属于各种公寓的可用日期范围之一。
所以我想写一个查询,比如:
{
"query": {
"bool": {
"must": [
{
"range": { "first_available_date": {"lte": "2016-08-20"} },
"match": { "status": "active" }
}
]
},
"filter": [
{
"range":
{
"apartments.availability.start": {"gte": "2016-08-20"},
"apartments.availability.end": {"lte": "2016-12-12"}
}
}
]
}
}
}
上面的查询将返回我两个公寓(与availability
条件匹配的多个对象),这是不正确的,它应该只返回文档,_id: hgk87783iii86937jh
因为只有一个availability
对象与条件匹配,即{"start": "2016-07-21", "end": "2016-12-19"}
. 因此,为了获得正确的结果,条件应该是 -availability
公寓文档中应该有一个完全符合条件的对象。那么如何强制在上述查询中应该有一个匹配项呢?第二个问题 - 我的查询是否正确?