2016-04-05 33 views
1

Bazı 26 sonucu döndüren bir ES sorgum var.Tarihe göre Elasticsearch toplama histogram artık komut dosyasıyla çalışmıyor

"aggregations" : { 
    "by_date" : { 
     "date_histogram" : { 
     "field" : "startDate", 
     "interval" : "month" 
     } 
    } 
} 

arama sonucunun toplama öğesi şöyle görünür: Şimdiye kadar iyi

"aggregations": { 
    "date_histogram": { 
     "buckets":[ 
     {"key_as_string":"2016-01-01T00:00:00.000Z", "key":1451606400000, "doc_count":18}, 
     {"key_as_string":"2016-02-01T00:00:00.000Z", "key":1454284800000, "doc_count":8} 
     ] 
    } 
} 

sorgu şöyle toplama histogram elemanı vardır. Ancak istediğim, belirli ölçütlerle eşleşmeyen öğeleri kaldırmak için arama sonuçlarına karşı bazı komut dosyaları yapmaktır.

"aggregations" : { 
    "by_date" : { 
     "date_histogram" : { 
     "field" : "startDate", 
     "interval" : "month", 
     "script" : { 
      "inline" : "if (condition) {return 1} else {return 0}" 
     } 
    } 
} 

Maalesef bu tek sonuç kova sonuçları ve toplama kaybolur:

  • senaryoyu inline azaltılması: ben denedim ne

    "date_histogram": { 
        "buckets": [ 
         {"key_as_string": "1970-01-01T00:00:00.000Z", "key": 0, "doc_count": 26 } 
        ] 
    } 
    

    yüzden sorguya Bu ekledi öğe sadece return 1. Bu hala, value tarih alanının kendiliğinden geri dönen

  • kümelenmesi sonucunu doğurur. Sonuçlar ClassCastException - sonuç ES yapılandırma ayarlarını kontrol eden
  • numaralı olmalıdır. script.engine.groovy.{file|indexed|inline}.{aggs|mapping|search|update|plugin}, script.inline, script.indexed ve script.aggs için her şeyi etkinleştirdim.
  • 2.0 breaking aggregation changes'u kontrol etti, ancak hiçbiri alakalı görünmüyor.

Ben bana senaryo olmadan toplanmasını yapalım olur (ziyade toplama kısmı yerine) sorguda kendisi söz konusu filtreyi haiz ayrı sorgu çalıştırabilirsiniz biliyorum. Asıl nokta, aynı dizi arama sonucunu alan ve farklı filtreleme türleri (ve birleştirme) yapan bir düzine farklı topluluğum olmasıdır. Aynı sorguyu birden çok kez çalıştırmak karşı üretken ve kabul edilemez. Bildiğim kadarıyla, bu , 1.4.4 sürümünde çalışmak için kullanmış ancak artık 2.2.0 sürümünde çalışmamaktadır.

Bu bir hata mı? Ya da belki de aynı mantık farklı şekilde yeniden kullanılabilir, ör. Bucket Script Toplulama veya başka herhangi biriyle?

cevap

2

Yeni bir toplama çerçevesiyle ve groovy style betiğinde inline üçlüsü ile denediniz mi?

Daha önce aynı türde bir soruna girdim ve bunu nasıl çözdüm. Sizin toplama sorgusu şu şekilde görünecektir: Ayrıca ElasticSearch kurulum komut dosyaları klasöründe bir .groovy dosyası olarak komut tanımlayan ile deneyebilirsiniz

"aggs": { 
"2": { 
    "date_histogram": { 
    "field": "startDate", 
    "interval": "month", 
    }, 
    "aggs": { 
    "1": { 
     "sum": { 
     "script": "((condition) ? 1 : 0)", 
     "lang": "expression" 
     } 
    } 
    } 
} 
} 

Not.

Yardım edeceğini umarız.

Saygılarımızla.