Edited at
KOIL CSCDay 12

Elasticsearch with RoRで色んな検索をしてみる。その1

More than 1 year has passed since last update.

自分がハマったので記述してまいります。

記述するって結構コストかかることなので、毎度適当にやってしまう自分がいる。。。ショボーン(´・ω・`)

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部分を記述します。