Elasticsearch - 如何获得给定日期范围的最低价格

时间:2017-01-25 17:45:28

标签: c# elasticsearch nest

我在酒店预订应用程序上工作,需要显示低价日历。

我创建了一个像这样的Price类:

{'name1', 'name4'}

现在想获得某个城市的最低价格。 我试过这样的事情:

public class Price
{
    public string Id { get; set; }
    public int CityId { get; set; }
    public int HotelId { get; set; }
    public double Value { get; set; }
    public DateTime Date { get; set; }
}

问题是,如果这个城市有几家酒店,我每天会得到不止一个价格。

以下是一个例子:

var result = client.Search<Price>(s => s
    .Skip(0)
    .Take(1000)
    .Query(q => q
        .Bool(b => b
            .Must(
                m => m.Term(t => t.CityId, cityId),
                m => m.DateRange(r => r.Field(rf => rf.Date).GreaterThanOrEquals(startDate).LessThanOrEquals(endDate))))));

如果我发送以下请求:

Id = 1
CityId = 1
HotelId = 1
Value = 100
Date = 2017-01-25

Id = 2
CityId = 1
HotelId = 2
Value = 200
Date = 2017-01-25

Id = 3
CityId = 1
HotelId = 1
Value = 400
Date = 2017-01-26

Id = 4
CityId = 1
HotelId = 2
Value = 300
Date = 2017-01-26

我的查询将返回文件1,2,3和4 但我想只返回文件1和4 (100是2017-01-25的最低价,300是2017-01-26的最低价)

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

我没有很多关于嵌套及其语法的工作知识。因此,我将尝试为您提供本机ES查询,然后您可以在nest上进行处理。

{
    "aggs": {
        "date_histogram": {
            "date_histogram": {
                "field": "Date",
                "interval": "day"
            },
            "aggs": {
                "min_per_day": {
                    "min": {
                        "field": "Value"
                    }
                }
            }
        }
    },
    "query": {
        "bool": {
            "must": [{
                "term": {
                    "cityId": {
                        "value": 2
                    }
                }
            }, {
                "range": {
                    "Date": {
                        "gte": 10,
                        "lte": 20
                    }
                }
            }]
        }
    }
}

添加一天间隔的日期直方图,并进一步评估聚合,以便在值字段上最小化。

由于