Elasticsearch:运行 聚合字段并使用不匹配值的正则表达式过滤掉特定值

Elasticsearch: Run aggregation on field & filter out specific values using a regexp not matching values

我正在尝试 运行 字段上的聚合并忽略特定值!所以我有一个字段 path,它包含一堆不同的 url 路径。

{
   "size": 0,
   "aggs": {
      "paths": {
            "terms":{
               "field": "path" // Count the no unique path ~> values
            }

      }
   },
   "filter": {
      "bool": {
         "must_not": [
            {
               "regexp": {
                  // path MUST NOT CONTAIN media | cache
                  "path": {
                    "value": "(\/media\b|\bcache\b)"
                  }
               }
            }
         ]
      }
   }
}

当 运行ning 时,它不会过滤掉路径包含 cache 或 media?!

的文档

如果我删除 过滤器,如果我将其留在原处,将返回相同的结果。

您可以像这样尝试 excluding 术语聚合中的那些值

{
  "size": 0,
  "aggs": {
    "path": {
      "terms": {
        "field": "path",
        "exclude": ".*(media|cache).*"
      }
    }
  }
}

注意:来自documentation

Note: The performance of a regexp query heavily depends on the regular expression chosen. Matching everything like .* is very slow as well as using lookaround regular expressions. If possible, you should try to use a long prefix before your regular expression starts

另一种方法是在查询阶段删除这些文档,这样您就可以将过滤器移动到查询,然后聚合剩余的结果。

编辑:带日期过滤器

您可以将日期过滤器添加到查询中,这样您就只会得到过去一天的结果,这样就可以了。

{
  "query": {
    "range": {
      "name_of_date_field": {
        "gte": "now-1d"
      }
    }
  },
  "size": 0,
  "aggs": {
    "path": {
      "terms": {
        "field": "path",
        "exclude": ".*(media|cache).*"
      }
    }
  }
}