Я работаю над заявлением о бронировании отеля и вам нужно отобразить календарь с низкой ценой.Elasticsearch - как получить самую низкую цену за данный диапазон дат
Я создал класс Цены, как это:
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
Если я отправить следующий запрос:
cityId = 1
startDate = 2017-01-25
endDate = 2017-01-26
Мой запрос возвращает документы 1, 2, 3 и 4.
Но я хотел бы вернуться только документы 1 и 4.
(100 - самая низкая цена на 2017-01-25, а 300 - самая низкая цена на 2017-01-26)
Любая помощь будет принята с благодарностью!
Вы пытались использовать агрегации, в частности, агрегацию мин? https://www.elastic.co/guide/en/elasticsearch/client/net-api/1.x/min-aggregation.html –
Я попытался добавить .Агрегации (a => a.Min ("min_price" , ma => m. Field (p => p.Value))), но это дает мне только одну аггрегацию (общая минимальная цена). Мне нужна самая низкая цена за день, а не самая низкая цена за весь набор результатов. –
Вам необходимо использовать агрегацию DateHistogram с минимальной суммой, и вы получите то, что ожидаете за каждый день. – Val