2017-01-25 5 views
0

Я работаю над заявлением о бронировании отеля и вам нужно отобразить календарь с низкой ценой.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)

Любая помощь будет принята с благодарностью!

+0

Вы пытались использовать агрегации, в частности, агрегацию мин? https://www.elastic.co/guide/en/elasticsearch/client/net-api/1.x/min-aggregation.html –

+0

Я попытался добавить .Агрегации (a => a.Min ("min_price" , ma => m. Field (p => p.Value))), но это дает мне только одну аггрегацию (общая минимальная цена). Мне нужна самая низкая цена за день, а не самая низкая цена за весь набор результатов. –

+1

Вам необходимо использовать агрегацию DateHistogram с минимальной суммой, и вы получите то, что ожидаете за каждый день. – Val

ответ

0

Я не очень много знаю о гнезде и синтаксисе. Поэтому я попытаюсь дать вам собственный ES-запрос, и вы сможете позже его обработать на гнезде.

{ 
    "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 
        } 
       } 
      }] 
     } 
    } 
} 

Добавить гистограмму даты с интервалом в один день и провести оценку агрегации для минимума в поле Значение.

Thanks

Смежные вопросы