2016-07-15 112 views
0

我试图通过以下查询查询有关elasticsearch中文档的统计信息。问题是,我试图忽略具有某些值的文件logger,但我不知道如何。下面的查询将所有正确的文档选择为该集合,但它不排除具有不希望的值的文档。在弹性搜索中过滤OUT匹配文档与聚合

任何建议,非常欢迎。

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

这应该为你工作,因为我从聚集在同一水平取出filterterms

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

谢谢,我会在第二时间尝试。我的印象是'不'过滤器已被弃用。 – Marcin

+0

@Marcin是'not'已被弃用。你应该用'must_not'来使用'bool'。你可以在查询中替换它们,两者都会给你相同的结果。 –

+0

这很好。我实际上意识到,我的问题的很大一部分是我将更改保存到与正在运行的文件不同的文件,因此我不确定我的问题是否真实,但我确信此答案是真实的和工作。 – Marcin