LoginSignup
1
2

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-12-11

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

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

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2