2013-05-28 16 views
9

mam coś takiego przechowywania informacji w następującym elastycznego wyszukiwania:Elasticsearch zakres dat przecięcia

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

Zważywszy, że mam inny zakres dat (podane z wejścia użytkownika na przykład) Ja chce wyszukać przecinających zakres czasu. Podobny do tego: Determine Whether Two Date Ranges Overlap który określa, że ​​logika jest po co jestem po:

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

Ale jestem pewien, w jaki sposób, aby dopasować to do elastycznej zapytaniem, chciałbym użyć filtru dystansu oraz ustawić tylko wartości "do", pozostawiając puste z? Czy istnieje bardziej skuteczny sposób robienia tego?

+0

powinny wejście użytkownik range być całkowicie „pokryta” przez timerange doc, czy to w porządku, że” tylko częściowo się nakładasz? –

Odpowiedz

15

Aktualizacja: Jest teraz możliwe użycie typu danych date_range, który został dodany w elasticsearch v5.2. W przypadku wcześniejszej wersji elastycznego wyszukiwania nadal obowiązuje poniższe rozwiązanie.

Aby przetestować na skrzyżowaniu, należy połączyć dwie kwerendy zasięgu w jednym zapytaniu użyciu kwerendy bool:

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

Co zrobić, jeśli chcesz wykluczyć krzyżujące się zakresy dat z wyników? Spodziewałbym się, że "must_not" zadziała, ale tak nie jest. – goldstein

+0

Czy ta aktualizacja powinna brzmieć "To jest * teraz * możliwe"? – Necoras

+1

@Necoras Dzięki! Dobry połów! – imotov

Powiązane problemy