2014-05-22 24 views
19

Elasticsearch'te bir toplayıcıyla bağlantılı olarak nasıl bir filtre kullanabilirim?Birden çok filtre ve bir araya getirme elasticsearch

Resmi belgeler, filter ve aggregations için yalnızca önemsiz örnekler verir ve dsl sorgusunun resmi bir açıklaması yoktur - karşılaştırın, örn. postgres documentation ile.

ben elasticsearch (hayır ayrıştırma hataları) tarafından kabul edilen şu sorguyu bulundu deneyerek sayesinde

ama yok sayar verilen filtreler:

{ 
    "filter": { 
    "and": [ 
     { 
     "term": { 
      "_type": "logs" 
     } 
     }, 
     { 
     "term": { 
      "dc": "eu-west-12" 
     } 
     }, 
     { 
     "term": { 
      "status": "204" 
     } 
     }, 
     { 
     "range": { 
      "@timestamp": { 
      "from": 1398169707, 
      "to": 1400761707 
      } 
     } 
     } 
    ] 
    }, 
    "size": 0, 
    "aggs": { 
    "time_histo": { 
     "date_histogram": { 
     "field": "@timestamp", 
     "interval": "1h" 
     }, 
     "aggs": { 
     "name": { 
      "percentiles": { 
      "field": "upstream_response_time", 
      "percents": [ 
       98.0 
      ] 
      } 
     } 
     } 
    } 
    } 
} 

Bazı insanlar yerine filter ait query kullanmanızı öneririz. Ancak resmi belgeler, tam değerleri filtrelemek için genellikle the opposite'u önerir. query ile ilgili başka bir sorun: filtreler bir and, query içermez. Birisi bana, önemsiz olmayan sorguları yazmayı açıklayan belgelere, bloga veya kitaba işaret edebilir: en az bir toplu artı çoklu filtre.

cevap

8

Filtrenizi filtered -query ürününüze koyun.

En üst düzey filter yalnızca arama isabetlerini filtrelemek içindir, yönler/toplamalar değil. Bu oldukça yaygın karışıklık nedeniyle, post_filter için 1.0 olarak yeniden adlandırıldı.

Ayrıca, sık sık bool değil and/or kullanmak istiyorum neden bu yazı içine bakmak isteyebilirsiniz: http://www.elasticsearch.org/blog/all-about-elasticsearch-filter-bitsets/

24

Ben filter aggregation kullanarak sona erdi - filtrelenmeyen sorgu. Şimdi 3 tane iç içe geçmiş ag elementim var.

@ alex-brasetvik tarafından önerilen olarak ben de yerine and ait bool filtre kullanın

nedeniyle http://www.elasticsearch.org/blog/all-about-elasticsearch-filter-bitsets/

Benim son uygulama:

@geekQ 'ın Yanıta
{ 
    "aggs": { 
    "filtered": { 
     "filter": { 
     "bool": { 
      "must": [ 
      { 
       "term": { 
       "_type": "logs" 
       } 
      }, 
      { 
       "term": { 
       "dc": "eu-west-12" 
       } 
      }, 
      { 
       "term": { 
       "status": "204" 
       } 
      }, 
      { 
       "range": { 
       "@timestamp": { 
        "from": 1398176502000, 
        "to": 1400768502000 
       } 
       } 
      } 
      ] 
     } 
     }, 
     "aggs": { 
     "time_histo": { 
      "date_histogram": { 
      "field": "@timestamp", 
      "interval": "1h" 
      }, 
      "aggs": { 
      "name": { 
       "percentiles": { 
       "field": "upstream_response_time", 
       "percents": [ 
        98.0 
       ] 
       } 
      } 
      } 
     } 
     } 
    } 
    }, 
    "size": 0 
} 
+4

muhtemelen en sevdiğim kişisin. Bununla saatlerce savaşıyordum. – simonmorley

+3

Bu çözümde, top aggr alanı "filtrelenmiş" olarak adlandırılır ve bu, http://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-filtered-query.html ile karıştırılmamalıdır, öyleyse lütfen başka bir isim kullanın (örn. "aggresults") - bu ismin altında cevap olarak sonuç alacaktır. Lütfen referansı kontrol edin: http://www.elastic.co/guide/en/elasticsearch/reference/master/search-aggregations-bucket-filter-aggregation.html ve answer http://stackoverflow.com/a/24823895/565525 . –

+0

ES 5.x ile çalışır, şerefe! –

0

daha: Filtre dizesi destekleyecek çok sayfalı arama terimi için boşluk karakterini kullanın:

{ "aggs": { 
    "aggresults": { 
     "filter": { 
     "bool": { 
      "must": [ 
      { 
       "match_phrase": { 
       "term_1": "some text with space 1" 
       } 
      }, 
      { 
       "match_phrase": { 
       "term_2": "some text with also space 2" 
       } 
      } 
      ] 
     } 
     }, 
     "aggs" : { 
      "all_term_3s" : { 
       "terms" : { 
        "field":"term_3.keyword", 
        "size" : 10000, 
        "order" : { 
         "_term" : "asc" 
        } 
       } 
      } 
     } 
    } }, "size": 0 } 
İlgili konular