2016-04-26 104 views
0

我想在聚合数据上运行后过滤器,但它不像我期望的那样工作。有人可以查看我的查询,并建议我在这里做错了什么。弹性搜索子集聚后过滤器

"query" : { 
    "bool" : { 
     "must" : { 
     "range" : { 
      "versionDate" : { 
      "from" : null, 
      "to" : "2016-04-22T23:13:50.000Z", 
      "include_lower" : false, 
      "include_upper" : true 
      } 
     } 
     } 
    } 
    }, 
    "aggregations" : { 
    "associations" : { 
     "terms" : { 
     "field" : "association.id", 
     "size" : 0, 
     "order" : { 
      "_term" : "asc" 
     } 
     }, 
     "aggregations" : { 
     "top" : { 
      "top_hits" : { 
      "from" : 0, 
      "size" : 1, 
      "_source" : { 
       "includes" : [ ], 
       "excludes" : [ ] 
      }, 
      "sort" : [ { 
       "versionDate" : { 
       "order" : "desc" 
       } 
      } ] 
      } 
     }, 
     "disabledDate" : { 
      "filter" : { 
      "missing" : { 
       "field" : "disabledDate" 
      } 
      } 
     } 
     } 
    } 
    } 
} 

步骤在查询:

  1. 通过indexDate过滤小于或等于给定的日期。
  2. 基于formId的聚合。每个formId形成桶。
  3. 按降序排序并返回每个存储桶的最高命中结果。
  4. 运行排序subaggregation后subaggregation过滤器和桶,其中禁用的日期不为空删除所有文件。(这是不工作)

回答

0

post_filter整个目的是运行聚合有已计算。因此,post_filter对聚合结果没有任何影响。

什么,你可以在你的情况做的是申请一个顶级filter aggregation,使没有disabledDate文件没有考虑到聚合,即只考虑文件disabledDate

{ 
    "query": { 
    "bool": { 
     "must": { 
     "range": { 
      "versionDate": { 
      "from": null, 
      "to": "2016-04-22T23:13:50.000Z", 
      "include_lower": true, 
      "include_upper": true 
      } 
     } 
     } 
    } 
    }, 
    "aggregations": { 
    "with_disabled": { 
     "filter": { 
     "exists": { 
      "field": "disabledDate" 
     } 
     }, 
     "aggs": { 
     "form.id": { 
      "terms": { 
      "field": "form.id", 
      "size": 0 
      }, 
      "aggregations": { 
      "top": { 
       "top_hits": { 
       "size": 1, 
       "_source": { 
        "includes": [], 
        "excludes": [] 
       }, 
       "sort": [ 
        { 
        "versionDate": { 
         "order": "desc" 
        } 
        } 
       ] 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 
+0

我有一个用例需要在计算聚合时考虑disabledDate!= null的文档。一旦聚合完成,我想用所有的桶中的disabledDate!= null过滤所有文档。所以我试图在聚合完成后执行后过滤器,以返回缺少disabledDate的文档,该文档被禁用== null。 –

+0

在聚合计算完成后,您无法从存储桶中删除任何**。使用查询和过滤器,您只能决定将哪些文档放入聚合管道中,但是一旦聚合计算完毕,您就无法修改这些存储桶。 – Val

+0

感谢您澄清疑问。我的用例是这样的,当我在聚合桶上执行了tophit后,如果一个桶有一个disabledDate!= null的文档,我不想从该桶中返回任何结果。考虑V1被禁用并且与给定时间最接近,它是返回作为tophit。如果我执行后过滤器,则不应该从该桶中返回任何内容。这就是要求。但是,如果我在聚合之前过滤V1文档,那么可能会返回V2,这是距同一个存储桶的给定时间的下一个最接近的文档。我如何实现这一目标?我在SQL中得到了这个工作。 –