Elasticsearch:在字段&上运行聚合使用不匹配值

时间:2016-09-28 02:31:30

标签: regex elasticsearch elasticsearch-query

我正在尝试在字段上运行聚合&忽略具体的价值!所以我有一个字段路径,它包含一堆不同的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)"
                  }
               }
            }
         ]
      }
   }
}

运行此功能时,它不会过滤掉包含缓存或媒体的路径的文档?!

如果我删除了过滤器,如果我将其删除,则会返回相同的结果。

1 个答案:

答案 0 :(得分:2)

您可以尝试excluding条款聚合中的这些值,如此

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

警告:来自documentation

  

注意:正则表达式查询的性能很大程度上取决于常规   表达式选择。匹配像。*这样的一切都很慢   使用环绕正则表达式。如果可能的话,你应该尝试   在正则表达式开始之前使用长前缀

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

编辑:使用日期过滤器

您可以添加日期过滤器进行查询,以便您只获得过去一天的结果,这样的效果就可以了。

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