【誰でも簡単に試せる】Rails+ElasticSearchを体験できるサンプルアプリを作りました
こんにちはTedです。
RailsでElasticSearchを簡単に導入するためのGemを作ったので、こちらを利用してサンプルアプリを作ってみました。 元々、私自身が業務で使用するElasticSearchにまつわるタスクをミニマムに検証したり、余暇で研究したりするためのアプリでしたが共有できそうなものなので公開してしまうことにしました。 前回書いた記事と合わせて読んでいただければ良いかなとおもいます。どんなことをするGemかはリンクの記事を閲覧いただければ、少しでも理解いただけるとおもいますが、体系的に学習するサンプルアプリのセットアップについてをこちらの記事でご紹介したいとおもいます。
環境構築
READMEに簡単に環境構築の方法を記述していますが、少しだけ細かくこちらでご紹介したいとおもいます。
- Ruby 2.6.3
- Rails 6.0.2.2
- PostgreSQL 9.6.9
- elasticsearch 6.8.8
- Redis
- Sidekiq
Ruby、 Railsに関しては至っておなじみの普通です。しかし、サンプルアプリでDB、elasticsearch、Redis、Sidekiqをバージョン合わせてインストールしたり構築するのが面倒だと思ったのでdocker-composeでコンテナ上でそれぞれ起動させることにしました。
docker-compose.ymlの中でDB、elasticsearch、Redisのデータは./docker/data
以下にそれぞれ格納されるようになるので、Dockerイメージはお手元の環境にpullすることになりますがそれ以外はプロジェクトのディレクトリに全て収まるはずなので手元の環境を変に汚すことなくelasticsearchを体験できるとおもいます。
Sidekiqに関しては、./config/puma.rbでスレッドの1つをSidekiqに割いて実行するように設定しています。サンプルアプリでelasticsearchを体験するだけなら特に問題にもならないはずで、それよりも立ち上げコストでできるだけ下げたかったのでこのような設定になっています。
READMEにelasticsearchのインデックスのセットアップ用のrakeタスクを用意しています。サンプルアプリはインデックスがなければ動かすことができないのでからなず実行してください。
タスクの中では、私が作成したGemで提供してるクラスメソッドindex_setup
が実行されるだけで、次のようなことが実行されます。
- インデックスの作成
- 作成したインデックスにエイリアスをつけて使用中にする
- 作成したインデックスに現在のDBのデータを同期させる(最初はDBの内容がないはずなので何も起こらないです)
セットアップが完了し、サーバーの立ち上げに成功したら次のような画面になります。
データを作る
画面が表示されたらArtistモデルのレコードを作成できるので/artists/new
で適当にデータを作ります。
テストさんというArtistのデータが作成されました。この段階でActiveRecordのコールバックによってElasticSearchに同じデータがドキュメントとして格納されているはずです。
試しにcurlコマンドでアクセスしてみます。
curl -XGET "http://localhost:9300/artists_development_202008111757/_doc/16?pretty"
docker-compose.ymlをそのまま使用されている場合はlocalhostの9300ポート指定、artists_development_xxxxxxの箇所は作成されたインデックスになりますのでブラウザ上でエイリアスがついているインデックスを指定すると良いです。_docの後の16はDBのidとリンクしていますので作成したレコードのidを指定してあげるとその情報がjson形式で返ってきます。elasticsearchのエンドポイントについてはまた別の機会にご紹介したいとおもいます。
検索
これで検索する準備が整いました。検索画面/artists/search
で実際に先ほど作ったドキュメントを検索してみましょう。
画面のような検索をしてみました。
赤枠は実際にelasticsearchのapiに投げたパラメータになります。赤枠の直上には検索結果のドキュメントが並びます。今回はまだ1つしか保存していないので先ほど保存したドキュメントが表示されています。
サクッとですがこんな感じで検索できるようになります。
最後に
こちらのサンプルアプリは自由に改造していただいて構いません。検証や学習の導入に使っていただければ幸いです。また、ご意見やご要望等は歓迎いたしますのでよろしくお願いします。 私自身がelasticsearchについてcurlコマンドでelasticsearchのいろんなapiにアクセスしてjsonのレスポンスをみながら学習を進めたりもしましたので手元の環境でいろいろ遊んでみると良いとおもいます!(ちなみにkibanaは使ってないです)