Carpe Diem

備忘録。https://github.com/jun06t

FilterとAggregationの組み合わせ

概要

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

ソース