2013-05-28 19 views
9

sto memorizzare qualcosa come le seguenti informazioni in elasticsearch:elasticsearch intervallo di date intersezione

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

Dato che ho un altro intervallo di date (data da input dell'utente, per esempio) Sono voler cercare un intersezione intervallo di tempo. Simile a questo: Determine Whether Two Date Ranges Overlap che delinea che la seguente logica è quello che sto cercando:

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

Ma io sono sicuro di come adattare questo in una query di ricerca elastico, dovrei utilizzare un filtro gamma e impostare solo i valori "a", lasciando da bianco? O c'è un modo più efficiente per farlo?

+0

deve l'input dell'utente gamma essere completamente 'coperti' dal TimeRange doc, o è giusto che' si sovrappongono solo parzialmente? –

risposta

15

Aggiornamento: è ora possibile utilizzare il tipo di dati date_range aggiunto in elasticsearch v5.2. Per una versione precedente di elasticsearch si applica ancora la seguente soluzione.

per verificare incrocio, si dovrebbe combinare due interrogazioni gamma in una singola query utilizzando Query bool:

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

Cosa fare se si desidera escludere intervalli di date intersecanti dai risultati? Mi aspetterei che "must_not" funzioni, ma non lo è. – goldstein

+0

Se l'aggiornamento leggeva "È * ora * possibile"? – Necoras

+1

@Necoras Grazie! Buona pesca! – imotov

Problemi correlati