はじめに
最近、個人的に作っているアプリで全文検索を使ってみたくなり、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などにも手を出していきたいです。