2016-07-15 2 views
0

Я пытаюсь запросить статистику о документах в elasticsearch со следующим запросом. Проблема в том, что я пытаюсь игнорировать документы с определенными значениями для поля logger, но я не могу понять, как это сделать. В нижеследующем запросе выбираются все нужные документы в набор, но он не исключает документы с нежелательными значениями.Отфильтровать соответствующие документы в elasticsearch с агрегацией

Любые предложения очень приветствуются.

{ 
    "query": { 
    "bool": { 
     "filter": { 
     "bool": { 
      "must_not": { 
      "terms": { 
       "logger": [ 
       "experimentsplitsegmentlogger_errors", 
       "ExperimentLogger" 
       ] 
      } 
      } 
     } 
     }, 
     "must_not": { 
     "terms": { 
      "logger": [ 
      "experimentsplitsegmentlogger_errors", 
      "ExperimentLogger" 
      ] 
     } 
     }, 
     "must": { 
     "exists": { 
      "field": "count" 
     } 
     } 
    } 
    }, 
    "aggs": { 
    "keys": { 
     "filter": { 
     "bool": { 
      "must_not": { 
      "terms": { 
       "logger": [ 
       "experimentsplitsegmentlogger_errors", 
       "ExperimentLogger" 
       ] 
      } 
      } 
     } 
     }, 
     "terms": { 
     "field": "logger" 
     }, 
     "aggs": { 
     "hostnames": { 
      "terms": { 
      "field": "hostname" 
      }, 
      "aggs": { 
      "pids": { 
       "terms": { 
       "field": "pid" 
       }, 
       "aggs": { 
       "time_stats": { 
        "stats": { 
        "field": "timestamp" 
        } 
       }, 
       "count_stats": { 
        "stats": { 
        "field": "count" 
        } 
       } 
       } 
      } 
      } 
     } 
     } 
    } 
    }, 
    "size": 0 
} 
+0

ваших фильтров и терминов агрегатах находятся на том же уровне, сроки должен быть один уровень вложенных в '' aggs' из filter', и почему у вас есть фильтры 3 раза, один раз должен работать, если это правильно казнены. –

+0

@SumitKumar У меня есть три раза, потому что он не работает. Я был бы признателен, если бы вы могли опубликовать ответ с примером того, что вы имеете в виду, потому что я нахожу ваш смысл неясным. – Marcin

ответ

1

Это должно работать для вас, как я удалил filter и terms из того же уровня агрегации.

{ 
    "query": { 
    "bool": { 
     "filter": { 
      "not": { 
      "terms": { 
       "logger": [ 
       "experimentsplitsegmentlogger_errors", 
       "ExperimentLogger" 
       ] 
      } 
      } 
     }, 
     "must": { 
     "exists": { 
      "field": "count" 
     } 
     } 
    } 
    }, 
    "aggs": { 
    "keys": { 
     "terms": { 
     "field": "logger" 
     } 
    } 
    }, 
    "size": 0 
} 
+0

Спасибо, я попробую это через секунду. У меня создалось впечатление, что фильтр 'not' был устаревшим. – Marcin

+0

@Marcin Да 'not' устарел. вы должны использовать 'bool' с' must_not'. вы можете заменить это в запросе, оба дадут вам тот же результат. –

+0

Это отлично работает. Я действительно понял, что большая часть моей проблемы заключалась в том, что я сохранял свои изменения в другом файле с того, с которым работал, поэтому я не уверен, что моя проблема была реальной, но я уверен, что этот ответ реален и работает. – Marcin