Elasticsearch::DSLでfilterをネストしたいっ!

elasticsearch-dsl(gem)でドキュメントを取得したいっ!で、DSLが使えるようになったのはいいんですが、複雑なqueryを書こうとするといちいちググるのが手間なのでメモっておきます。

filter

userに直接名前が入っているような場合であれば

{
  'user': '太郎'
}
require 'elasticsearch-dsl'
include Elasticsearch::DSL

definition = search do
  query do
    filter do
      term user: '太郎'
    end
  end
end

上記で取得できるんですが、下記のようなドキュメントの場合は

{
  'user': {
    'name': '太郎'
    'age': 15
  }
}

普通に書こうとすれば

definition = search do
  query do
    filter do
      term 'user.name': '太郎'
    end
  end
end

↑のように書きたいところですがエラーになるので、↓こっちで。

definition = search do
  query do
    filterd do
      filter do
        nested do
          path 'user'
          filter do
            term 'user.name': '太郎'
          end
        end
      end
    end
  end
end

nestedとpathの指定でドキュメントが取得できるようになりました。