2016-09-28 35 views
1

我试图在字段&上运行聚合忽略特定值!所以我有一个路径,它包含一堆不同的url路径。Elasticsearch:在字段上运行聚合并使用正则表达式匹配值过滤掉特定值

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

运行此,它不会过滤掉有一个包含缓存或媒体路径的文件呢?!

如果我删除过滤,相同的结果是,如果我离开它在返回

回答

2

你可以尝试这样的

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

注意excluding条款聚集内的值:来自documentation

注意:性能正则表达式查询的准确性取决于选择的常规表达式 。匹配类似*的所有内容非常缓慢,以及使用环顾正则表达式的 。如果可能的话,你应该尝试 使用长前缀正则表达式开始

另一种方法之前,将摆脱在查询阶段这些文件,所以你可以在剩下的结果汇总移动你的过滤器进行查询,然后。

编辑:随着日期过滤器

你可以添加日期过滤器来查询,这样你只会得到过去一天的结果,像这样的工作。

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

哦,是的,这是一个想法。但是这样做的确很好:)我并不担心它的表现,因为它是由CRON触发的,并且不需要很快! – James111

+0

是否可以添加日期范围过滤器?所以我只从前一天获得aggs而不是整个索引? – James111

+1

我已经添加日期过滤器来查询,我希望它有帮助 – ChintanShah25

相关问题