我在酒店预订应用程序上工作,需要显示低价日历。
我创建了一个像这样的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的最低价)
非常感谢任何帮助!
答案 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
}
}
}]
}
}
}
添加一天间隔的日期直方图,并进一步评估聚合,以便在值字段上最小化。
由于