我收集了一些文件,其中每个文件都指出了给定酒店和一天的可用客房,以及当天的费用:
{ "hotel_id": 2016021519381313, "day": "20200530", "rooms": [ { "room_id": "00d70230ca0142a6874358919336e53f", "rate": 87 }, { "room_id": "675a5ec187274a45ae7a5fdc20f72201", "rate": 53 } ] }
作为映射:
{ "properties": { "day": { "type": "keyword" }, "hotel_id": { "type": "long" }, "rooms": { "type": "nested", "properties": { "rate": { "type": "long" }, "room_id": { "type": "keyword" } } } } }
我正在尝试找出一个查询,在该查询中我可以获取一组总费用小于给定金额的天的可用客房,并按总费用升序排序并分页。
到目前为止,我想出了一种方式来获取当天可用的房间及其总费用。基本上是按天过滤,然后按酒店和房间ID进行分组,要求聚合中的最小计数是我要查找的天数。
{ "size" : 0, "query": { "bool": { "must": [ { "terms" : { "day" : ["20200423", "20200424", "20200425"] } } ] } } , "aggs" : { "hotel" : { "terms" : { "field" : "hotel_id" }, "aggs" : { "rooms" : { "nested" : { "path" : "rooms" }, "aggs" : { "rooms" : { "terms" : { "field" : "rooms.room_id", "min_doc_count" : 3 }, "aggs" : { "sum_price" : { "sum" : { "field" : "rooms.rate" } } } } } } } } } }
因此,现在我很有趣,可以根据带有“房间”的子聚合的值在“酒店”级别按降序对结果存储桶进行排序,还可以对没有足够文档或“ sum_price”为大于给定的预算。但是我无法管理该怎么做。
我一直在研究“ bucket_sort”,但找不到基于子聚合排序的方法。我也一直在研究“ bucket_selector”,但是当它们不适合谓词时,它会给我空的桶。我可能没有正确使用它们。
哪种方法才是正确的方法?