LoginSignup
3
5

More than 3 years have passed since last update.

windowsでRails + elasticsearch環境を構築する

Last updated at Posted at 2019-05-03

はじめに

最近、個人的に作っているアプリで全文検索を使ってみたくなり、Elasticsearchの環境を構築しました。

しかし、家のPCのOSはWindowsで、Qiitaや開発ブログなどでは大体Mac(Linux)で書かれていて、Windowsを使っている身としては肩身が狭いです。。。そして、Elasticsearchを取り入れる時にも、エラーが結構出ました。

Windows + Railsでelasticsearchを取り入れた時に躓いた部分などを備忘録的に投稿します。elasticsearch初心者なので、初歩的なエラーが多いです。

アプリにelasticsearchをセットアップ

なお、セットアップにはこちらを参考にさせて頂きました。

gem 'elasticsearch-model', git: 'git://github.com/elasticsearch/elasticsearch-rails.git'
gem 'elasticsearch-rails', git: 'git://github.com/elasticsearch/elasticsearch-rails.git'
class PoolHall < ActiveRecord::Base
  include Elasticsearch::Model
end

以上をGemfileに記載して、bundle installを実行。Elasticsearch::Modelをincludeして、ためしにPoolHall.search 'test'をしてみました。

検索は出来ているように思えましたが、検索結果を出力してみようと思い、resultsのeachやmapを呼び出すと以下のようなエラーが出ました。

Faraday::ConnectionFailed in PoolHallsController#new

Failed to open TCP connection to localhost:9200 (Connection refused - connect(2) for "localhost" port 9200)
Extracted source (around line #6):

調べたところ、elasticsearchをlocalhost:9200で起動しないと駄目だと知りました。

elasticsearchをインストール

elasticsearchはJavaを実行できる環境が必要なので、こちらからJREをダウンロード。

Javaはインストールしていたので、実行できるかと思いきや、elasticsearchを実行するとエラーが出ました。こちらは、Javaのバージョンが古かったので、アップデートしたら実行できました。 Java SE Runtime Environment 8u211のWindows x86 Offlineをダウンロードし、インストールしました。

こちらのDownloadsのWindowsから、elasticsearchをダウンロード。バージョンは7.0.1です。

elasticsearchをダウンロードし、解凍したら、elasticsearch-7.0.1-windows-x86_64.zip\elasticsearch-7.0.1\bin\elasticsearch.batを実行すると、elasticsearchが起動できます。

インデックスを作成

以下のコマンドを実行。

rails c

elasticsearchを起動し、インデックスを作成し、登録。

PoolHall.__elasticsearch__.create_index! force: true
PoolHall.import

いちいち、コンソールを起動してやるのも面倒なので、こちらを参考にタスクを作成。

# rails g task elasticsearchで作成
namespace :elasticsearch do
  desc 'Elasticsearch のindex作成'
  task create_index: :environment do
    PoolHall.__elasticsearch__.create_index! force: true
  end

  desc 'Article を Elasticsearch に登録'
  task import_hall: :environment do
    PoolHall.import
  end
end

これで以下のコマンドでインデックスを作成できる。

rake elasticsearch:create_index
rake elasticsearch:import_hall

検索結果をactiverecordとして扱いたい

これで、検索の準備が整い、検索をしてみました。

@hall = PoolHall.search(params[:word)

viewで、検索結果を表示しようとしたところ、インスタンスメソッドを呼び出すところでメソッドが定義されていないとエラーが発生しました。

thumbnailというメソッドは、PoolHallモデルのインスタンスメソッドで、サムネイルを返すメソッドでした。

<%= @hall.each do |h| %>
  <%= image_tag h.thumbnail %>
<% end %>

調べてみると、検索結果はElasticSearchのオブジェクトとして返ってきていたので、当然の結果でした。activerecordとして扱いたい場合は以下の通り。

@hall = PoolHall.search(params[:word).records

おわりに

elasticsearchは非常に便利ですね。
今後はkibanaなどにも手を出していきたいです。

3
5
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
3
5