2016-04-26 72 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中得到了這個工作。 –