2013-05-28 28 views
9
Ben elastik arayışında aşağıdaki bilgileri gibi bir şey saklamak ediyorum

: Ben başka bir tarih aralığına sahiptir göz önüne alındığındaElasticsearch tarih aralığı kavşak

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

Bir şekilde kesişen aramak isteyen am (örneğin kullanıcı girişinden verilen) zaman aralığı. Bir aralık filtresi ve sadece set kullanmak olur ben elastik bir arama sorgusu halinde bu sığacak şekilde nasıl emin olduğum

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

Ama: Aşağıdaki mantık i sonra olduğum şey olduğunu özetliyor Determine Whether Two Date Ranges Overlap: Buna benzer 'to' değerleri boş bırakılıyor mu? Yoksa bunu yapmanın daha verimli bir yolu var mı?

+0

kullanıcı girişi tamamen doc timerange tarafından 'örtülü' ya tamam onlar' olduğunu edilmesi aralığı olmalıdır sadece kısmen örtüşüyor mu? –

cevap

15

Güncelleme: elasticsearch v5.2'de eklenen date_range veri türünü kullanmak artık mümkün. Elasticsearch'in daha önceki bir sürümü için aşağıdaki çözüm hala geçerlidir.

, kavşak test etmek için size bool sorgusunu kullanarak tek sorguya iki aralık sorguları birleştirmek olmalıdır:

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

Kesişen tarih aralıklarını sonuçlarınızdan çıkarmak isterseniz ne yapmalısınız? Çalışmak için "must_not" beklerdim ama değil. – goldstein

+0

Bu güncelleme "Bu * şimdi * mümkün" okunuyor mu? – Necoras

+1

@Necoras Teşekkürler! İyi yakalama! – imotov

İlgili konular