メモ

プログラミングなどの備忘録を書きます

elasticsearchでfilterとpost_filterを使ったらうまくいかなかった

termによる検索結果をさらに絞り込むためにpost_filterを使ったがうまくいかなかった。

post_filter

検索結果からさらに絞り込みを行うためのクエリで主にaggregationと組み合わせる。

このようなクエリを投げたが、 filterの結果から絞り込むのではなく、post_filterのみを適用した結果が返ってきてしまう。(2.2で確認。5以降では動くかも)

{
  "filter":{
      {"term":{"field1":"hoge"}},
  },
  "from":0,
  "size":100,
  "sort":{"createdAt":{"order":"desc"}},
  "post_filter":{"not":{"term":{"field2":"huga"}}}
}

queryと一緒に使うようにしたら動いた。

{
  "query":{
      {"term":{"field1":"hoge"}},
  },
  "from":0,
  "size":100,
  "sort":{"createdAt":{"order":"desc"}},
  "post_filter":{"not":{"term":{"field2":"huga"}}}
}

filterとqueryの違いについては公式のドキュメントで説明されている。 https://www.elastic.co/guide/en/elasticsearch/guide/current/_queries_and_filters.html

これによるとqueryはマッチした結果のスコアも一緒に知りたい時に使用するもので、filterは単にマッチするかどうか知りたい時に使うものらしい。 post_filterが使われる場合は単なる絞り込みではないと言うことなのだろうか。