自分がハマったので記述してまいります。
記述するって結構コストかかることなので、毎度適当にやってしまう自分がいる。。。ショボーン(´・ω・`)
Elasticsearchを利用しており、WEB画面をRails5で実装しようとした時のことです。
RoRとESでModel管理するのが面倒だなーと思っていたところ、
gemにelasticsearchがあることを知りました。
これは使えるんじゃないか。
ということで利用しようとしたところ、まとまってないことがあったので記述します。
サーバ環境
私が利用している環境は以下の通りです。
OS : Centos 6.8
Editor : vim
Elasticsearch
Elasticsearchをサクッとインストール
### rpm追加
$ rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
### 確認
$ cat /etc/yum.repos.d/elasticsearch.repo
[elasticsearch-2.x]
name=Elasticsearch repository for 2.x packages
baseurl=http://packages.elastic.co/elasticsearch/2.x/centos
gpgcheck=1
gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1
### install
$ yum install -y elasticsearch
### service start
$ service elasticsearch start
### 一応chkconfig追加
$ chkconfig --add elasticsearch
### 一応確認
$ curl localhost:9200 | jq .
Gemfile
RoRがインストールされていることが前提です。
Gemfileに以下の4つのGemfileを追加します。
$ vim Gemfile
[snip]
### elasticsearch
gem 'elasticsearch', git: 'git://github.com/elasticsearch/elasticsearch-ruby.git'
gem 'elasticsearch-dsl', git: 'git://github.com/elasticsearch/elasticsearch-ruby.git'
gem 'elasticsearch-model', git: 'git://github.com/elasticsearch/elasticsearch-rails.git'
gem 'elasticsearch-rails', git: 'git://github.com/elasticsearch/elasticsearch-rails.git'
[snip]
設定ファイル
RoRの初期設定ファイルを設定します。
ない場合は以下ような形で追記ください。
$ config/initializers/elasticsearch.rb
elasticsearch_url = ENV['ELASTICSEARCH_URL'] || ENV['WERCKER_ELASTICSEARCH_URL'] || 'http://localhost:9200'
Elasticsearch::Model.client = Elasticsearch::Client.new(host: elasticsearch_url)
require 'typhoeus/adapters/faraday'
- localhost部分は適当に変更して利用してください。
- require 'typhoeus/adapters/faraday'が何かのエラーで必要だったが、、、忘れたので割愛、気分が出たら調べます。
RoRで設定する
RoRの model, controller, view で利用する方法を記載します。
Model設定
ESのインデックスを指定する記述内容です。
また、ディレクトリはconcernsじゃなくても ../ のディレクトリでもOKです。
$ cat ./app/models/concerns/xxx.rb
class Xxx < ApplicationRecord
include Elasticsearch::Model ### こいつが重要
index_name "es_#{Rails.env}" ### 環境別にしてみる。
document_type 'test' ### 書かなくてもOK 今回は一応
end
以降の基本的な設定は Rails Webookさんのページ を参照してください。
長くなってしまう。。。
controllerで呼び出す。
上記設定したXxxモデルに、以下のようなメソットがあるとします。
$ cat ./app/models/concerns/xxx.rb
[snip]
def self.search(params = {})
keyword = params[:q]
[snip]
end
この場合controllerで以下のような呼び出しができます。
$ cat app/controllers/test_controller.rb
def index
@searchs = Xxx.search(params)
end
Viewで表示する。
model, controllerが揃ったところで、
Viewで表示して見ます。
$ cat app/views/tests/index.html.haml
### 検索結果数
= "検索結果: 約 #{@searchs.results.total} 件"
### 検索結果のイテレーション
- @searchs.each do | search |
= search.name
= search.note
### pager
= render 'pager', paginate:@searchs ### 大事なことは雷様が解決してくれる。
### aggregations
- searchs.aggregations.price.buckets do | price |
= price
というように表示できる(はず)です。
少し前に記述していて、今回最終確認していないコードを載せていますので
何かツッコミあれば教えてください。
次回は、今回ふれなかったaggregation部分を記述します。