【Rails】関連(アソシエーション)をもったモデルを構造化してElasticsearchに格納する

RailsでElasticsearchを使ってみたときのメモ.
Articles <-> Authorships <-> Authors という関連を持ったモデル群があるときに,例えば記事(Article)を全文検索したら著者名も検索対象に入れたい.

gem ‘elasticsearch-rails
gem ‘elasticsearch-model’
を使った場合について書きます.

mappings

mappings dynamic: 'false' do
    indexes :title, analyzer: 'kuromoji_analyzer', index: 'analyzed'
    indexes :authors do
        indexes :name, analyzer: 'kuromoji_analyzer', index: 'analyzed'
    end
end

例えば上のような形で,構造化されたマッピングを定義可能です.

as_indexed_json

def as_indexed_json(options={})
    self.as_json(
        include: {
            authors: {only: :name}
        }
    )
end

モデル側で関連を貼れていればincludeするだけで関連先ごと格納可能です.
これで,以下のようなデータが入るようになるので,無事著者名も検索対象となりました.

{
    "title": "hoge",
    "authors": [
        {
            "name": "piyo"
        },
        {
            "name": "huga"
        }
    ]
}