2015-07-28 188 views
9

我想實現的目標:我希望我的「年齡」聚合不會被查詢過濾器過濾,我希望能夠對其應用過濾器。如何過濾elasticsearch全局聚合?

所以,如果我開始與此查詢:

{ 
    "query":{ 
     "filtered":{ 
      "filter":{ "terms":{ "family_name":"Brown" } } //filter_1 
     } 
    }, 
    "aggs":{ 
     "young_age":{ 
      "filter":{ 
       "range":{ "lt":40, "gt":18 } //filter_2 
      }, 
      "aggs":{ 
       "age":{ 
        "terms":{ 
         "field":"age" 
        } 
       } 
      } 
     } 
    } 
} 

我的聚集 「young_age」 將由兩個FILTER_1和filter_2進行過濾。我不希望我的聚合被filter_1過濾。

當我正在尋找到的文件,我想全球的聚集會解決我的問題,我寫了查詢:

{ 
    "query":{ 
     "filtered":{ 
      "filter":{ "terms":{ "family_name":"Brown" } } //filter_1 
     } 
    }, 
    "aggs":{ 
     "young_age":{ 
      "global":{}, //<----------- add global 
      "filter":{ 
       "range":{ "lt":40, "gt":18 } //filter_2 
      }, 
      "aggs":{ 
       "age":{ 
        "terms":{ 
         "field":"age" 
        } 
       } 
      } 
     } 
    } 
} 

但隨後彈性搜索抱怨我filter_2:

「」」 發現了兩個聚集類型定義在[年齡] [全球]和[過濾器] 「」」

當然如果我刪除filter_2:

{ 
    "query":{ 
     "filtered":{ 
      "filter":{ 
       "terms":{ 
        "family_name":"Brown" 
       } 
      } 
     } 
    }, 
    "aggs":{ 
     "young_age":{ 
      "global":{}, 
      "aggs":{ 
       "age":{ 
        "terms":{ 
         "field":"age" 
        } 
       } 
      } 
     } 
    } 
} 

然後我的聚合不會被filter_1過濾(如預期的那樣)。

那麼我想如何將filter_2應用於我的全局聚合?或者我該如何實現這一目標?我記得寫了一些類似的方面過濾器...

回答

2

在我看來,這是一個post_filter的典型用例。正如醫生說:

的post_filter被應用到搜索的搜索請求的最後命中,之後聚集已經計算

您的查詢將是這樣的:

{ 
    "post_filter":{ 
     "terms":{ 
      "family_name":"Brown" //filter_1 
     } 
    }, 
    "aggs":{ 
     "young_age":{ 
      "filter":{ 
       "range":{ "lt":40, "gt":18 } //filter_2 
      }, 
      "aggs":{ 
       "age":{ 
        "terms":{ 
         "field":"age" 
        } 
       } 
      } 
     } 
    } 
} 

在這種情況下,搜索匹配是索引中的所有文檔。然後計算聚合(在filter_1之前)。之後,帶有filter_1的post_filter將被執行。

編輯:正如你在表彰說你有很多的聚合和唯一不應該由filter_1影響我使用全局聚集

{ 
    "query": { 
    "filtered": { 
     "filter": { 
     "term": { 
      "family_name": "Brown" 
     } 
     } 
    } 
    }, 
    "aggs": { 
    "young_age": { 
     "global": {}, 
     "aggs": { 
     "filter2": { 
      "filter": { 
      "range": { 
       "lt": 40, 
       "gt": 18 
      } 
      }, 
      "aggs": { 
      "age": { 
       "terms": { 
       "field": "age" 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 
+1

這樣做是可以固定的查詢,但實際上我有一個多聚合,並且只有其中一個不應該被filter_1過濾。所以用你的解決方案,這意味着我將不得不復制post_filter這些聚合,我覺得有點討厭(也可能不是從性能角度來看這麼好?) – adrienbourgeois

+1

@adrienbourgeois我使用全局聚合修復了查詢,讓我知道它是否適合你:) – moliware

+0

感謝隊友它的工作就像一個魅力!我已經接受你的答案。歡呼聲 – adrienbourgeois