概要
Aggregationの結果にフィルタをかけたいと思ったら、使うクエリによって検索結果とAggsの結果が異なったのでそのまとめ。
環境
- Ubuntu 14.04
- Elasticsearch 1.6.0
簡単な区別
フィルタ | 検索結果をフィルタする | aggsの結果をフィルタする |
---|---|---|
Filtered Query | ◯ | ◯ |
Filter Query | ✕ | ◯ |
Post Filter | ◯ | ✕ |
Filtered Query
使用したいケース(検索結果とaggsの両方フィルタしたい)
$10,000以上の車を知りたい。
かつ、aggsでその平均値を知りたい。
クエリ
GET /cars/transactions/_search?search_type=count { "query" : { "filtered": { "filter": { "range": { "price": { "gte": 10000 } } } } }, "aggs" : { "single_avg_price": { "avg" : { "field" : "price" } } } }
Filter Bucket
使用したいケース(検索結果はそのままでaggsのみフィルタしたい)
フォード社の車一覧を見たい。
かつ、aggsでユーザに先月売れた車の平均額を示したい。
クエリ
GET /cars/transactions/_search?search_type=count { "query":{ "match": { "make": "ford" } }, "aggs":{ "recent_sales": { "filter": { "range": { "sold": { "from": "now-1M" } } }, "aggs": { "average_price":{ "avg": { "field": "price" } } } } } }
Post Filter
使用したいケース(検索結果はフィルタしたい、aggsはそのまま)
緑色のフォード社の車を見たい。
ただし、aggsで表示している色一覧はそのまま。
クエリ
GET /cars/transactions/_search?search_type=count { "query": { "match": { "make": "ford" } }, "post_filter": { "term" : { "color" : "green" } }, "aggs" : { "all_colors": { "terms" : { "field" : "color" } } } }