2014-05-22 14 views
19

Jak mogę użyć filtru w połączeniu z agregatem w elastycznym wyszukiwaniu?Wiele filtrów i agregat w elastycznej analizie

Oficjalna dokumentacja podaje jedynie trywialne przykłady dla filter i dla aggregations i brak formalnego opisu zapytania dsl - porównaj np. z postgres documentation.

Poprzez wypróbowanie znalazłem następującą kwerendę, która jest akceptowana przez elasticsearch (parsowanie) bez błędów, ale ignoruje podane filtry:

{ 
    "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 
      ] 
      } 
     } 
     } 
    } 
    } 
} 

Niektórzy sugerują, używając query zamiast filter. Jednak oficjalna dokumentacja ogólnie zaleca the opposite filtrowanie dokładnych wartości. Kolejny problem z query: podczas gdy filtry oferują and, query, nie.

Czy ktoś może wskazać mi dokumentację, blog lub książkę, które opisują pisanie nietrywialnych zapytań: co najmniej jeden agregat plus wiele filtrów.

Odpowiedz

24

skończyło się używając filter aggregation - nie filtrowane zapytania. Teraz mam 3 zagnieżdżone elementy aggs.

Używam również bool filtr zamiast and jako zalecane przez @ alex-brasetvik powodu http://www.elasticsearch.org/blog/all-about-elasticsearch-filter-bitsets/

Moja ostateczna realizacja:

{ 
    "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

jesteś prawdopodobnie moją ulubioną osobą w tej chwili. Walczyłem z tym od wielu godzin. – simonmorley

+3

W tym rozwiązaniu pole top aggr nazywa się "filtrowane" i nie należy go mieszać z http://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-filtered-query.html, więc użyj innej nazwy (np. "aggresults") - pod tą nazwą otrzymasz wyniki w odpowiedzi. Sprawdź referencję: http://www.elastic.co/guide/en/elasticsearch/reference/master/search-aggregations-bucket-filter-aggregation.html i odpowiedz na http://stackoverflow.com/a/24823895/565525 . –

+0

Działa z ES 5.x, okrzyki !! –

0

więcej na odpowiedź @geekQ „s: wspieranie ciąg filtracyjny spacja char, dla wielowierszowego wyszukiwania termin, użyj poniżej:

{ "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 } 
Powiązane problemy