概要
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" }
}
}
}