2013-05-28 4 views
9

Я хранить что-то вроде следующей информации в упругом поиске:Elasticsearch диапазон дат пересечение

{ "timeslot_start_at" : "2013-02-01", "timeslot_end_at" : "2013-02-03" } 

Учитывая, что у меня есть другой диапазон дат (даются от пользовательского ввода, например) Я хотел искать пересекающийся временной диапазон. Подобно этому: Determine Whether Two Date Ranges Overlap Какие очерчивает, что следующая логика это то, что я после:

(StartDate1 <= EndDate2) and (StartDate2 <= EndDate1) 

Но я уверен в том, чтобы соответствовать этим в упругую поискового запроса, я использовал бы фильтр диапазона и только набор значения 'to', оставляя пустое? Или есть более эффективный способ сделать это?

+0

должен пользовательский ввод диапазона полностью «покрыты» в док TimeRange, или это нормально, они» просто частично перекрываются? –

ответ

15

Обновление: теперь можно использовать тип данных date_range, который был добавлен в elasticsearch v5.2. Для более ранней версии elasticsearch все еще применяется следующее решение.

Для проверки пересечения, вы должны объединить два запроса диапазона в одном запросе, используя булев запрос:

{ 
    "bool": { 
     "must": [ 
      { 
       "range": { 
        "timeslot_start_at": { 
         "lte": "2013-02-28" 
        } 
       } 
      }, 
      { 
       "range": { 
        "timeslot_end_at": { 
         "gte": "2013-02-03" 
        } 
       } 
      } 
     ] 
    } 
} 
+1

Что делать, если вы хотите исключить пересекающиеся диапазоны дат от ваших результатов? Я бы ожидал, что «must_not» будет работать, но это не так. – goldstein

+0

Должно ли это обновление читать «Это сейчас возможно»? – Necoras

+1

@Necoras Спасибо! Хороший улов! – imotov

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