2015-11-05 14 views
9

Şu an bir (zaman damgası) tarih alanındaki bir gün aralığını nasıl filtreleyeceğimi zaten biliyorum.ElasticSearch: Bir saat aralığı filtresi kullanarak bir tarih alanı nasıl sorgulanır

"range": { 
    "date": { 
     "gte": "2015-11-01", 
     "lte": "2015-11-30" 
    } 
} 

Ama gte gibi saatlerine göre aralıklar ile ilgilenen zaman nasıl tarihleri ​​filtrelemek için: "08:00:00" ve LTE: "10:00:00" Bu kolay bir soru? Mümkün mü?

Diğer bir deyişle ihtiyacım olan: Bu ayki olay (15-11-01/15-11-30) ancak sadece 8:00:00 - 10:00:00 saatleri arasında nasıl edinilir? Sorunuzu doğru anladıysam

+0

Bu saatler arasında, herhangi bir gün için? –

+0

Diyelim ki 2015-10-01 ve 2015-12-31 arasındaki tüm kayıtları almak istiyorum, ancak sadece bu saat aralığındaki olaylar: "8:00:00" ve "10:00:00" – xtingray

+0

Olası [Elasticsearch: Filtreleme, tarih ve saate göre farklı alanlar olarak] (http://stackoverflow.com/questions/33508044/elasticsearch-filtering-by-date-and-time-as-different-fields) – Val

cevap

3

o zaman

PUT your_index 
{ 
    "mappings": { 
    "your_type": { 
     "properties": { 
     "time": { 
      "type": "date", 
      "format": "HH:mm:ss" 
     } 
     } 
    } 
    } 
} 

gibi sadece zaman Sonra bu yardımcı olur mu bu

{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "range": { 
      "date": { 
       "gte": "2015-11-01", 
       "lte": "2015-11-30" 
      } 
      } 
     }, 
     { 
      "range": { 
      "time": { 
       "gte": "08:00:00", 
       "lte": "10:00:00" 
      } 
      } 
     } 
     ] 
    } 
    } 
} 

gibi sorgulayabilir endeksleri yeni bir alan eklemek zorunda düşünüyorum?

+0

Şu anda, "date" alanım şu şekildedir: {"type": "date", "format": "dateOptionalTime"}, bu gibi kayıtları destekler bu 2015-11-04T22: 10: 02 ve ne yazık ki yapabilirim ' benim uygulamada bile indeksler – xtingray

+0

değiştirmek, aynı biçimde var ama şey sadece "gte" gibi arama yapabilirsiniz: "2015-10-02T13: 34: 09", "lte": "2015-10-05T12 : 00: 00 "' hangi aralıklar arasındaki sonuçları size verecek ve belirli günlerde belirli bir zaman aralığı olan – ChintanShah25

15

Doğru günleri filtrelemek için range filtre ile bunu yapabiliriz ve sonra böyle istenilen saat filtrelemek için bir script filtreli: sırayla enable dynamic scripting emin olmak gerekir

{ 
    "query": { 
    "filtered": { 
     "filter": { 
     "bool": { 
      "must": [ 
      { 
       "range": { 
       "date": { 
        "gte": "2015-11-01", 
        "lte": "2015-11-30" 
       } 
       } 
      }, 
      { 
       "script": { 
       "script": "doc.date.date.getHourOfDay() >= min && doc.date.date.getHourOfDay() <= max", 
       "params": { 
        "min": 8, 
        "max": 10 
       } 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
} 

Not Bu sorgu çalışması için.

+0

Teşekkür ederim. Mükemmel çalışıyor. Bu arada, "getMinuteOfHour" yöntemini kullanarak dakikaları filtrelemek için başka bir komut dosyası eklemeyi denedim, ancak çalışmadı. Herhangi bir öneri? – xtingray

+0

Bu senaryoyu gösterebilir misin? – Val

+0

Merhaba @Val, lütfen 'getHourOfDay()' yönteminin nereden geldiğini söyler misiniz? groovy script motoru datetime manipülasyon için 'joda' kullanır? – ChintanShah25

0

Ben burada bir kez 6 pm geçerli günün başından itibaren sadece almak sonuçlarına derdi:

{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "query_string": { 
      "query": "(log_message:\"My Search String\")" 
      } 
     }, 
     { 
      "range": { 
      "@timestamp": { 
       "time_zone": "CET", 
       "gt": "now-24h/d", 
       "lte": "now-24h/d+18h" 
      } 
      } 
     } 
     ] 
    } 
    } 
} 

önemli bir parçası yuvarlak gece yarısına/akım günün başlayacak "şimdi-24h/g" dir, gt/lt (e) kullanıp kullanmadığınıza bağlı olarak biraz zor olsa da, ayrıntılar için bkz. reference doc.

İlgili konular