在Windows上搭建Rails + elasticsearch环境
首先
最近,我个人正在开发的应用程序中想要尝试使用全文搜索功能,于是我搭建了Elasticsearch的环境。
然而,我家的电脑操作系统是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,并尝试执行PoolHall.search ‘test’。
尽管搜索似乎成功了,但当我尝试输出搜索结果并调用results的每个元素和映射操作时,出现了以下错误。
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):
在我进行调查时,我得知只有在本地主机的9200端口上启动elasticsearch才行。
安装 Elasticsearch
由于Elasticsearch需要Java执行环境,因此您需要从这里下载JRE。
因为之前安装了Java,所以我以为可以运行elasticsearch,但是运行时出现了错误。原来是因为Java的版本太旧了,更新后就可以正常运行了。我下载并安装了Java SE Runtime Environment 8u211的Windows x86离线版本。
从Windows上的Downloads文件夹中下载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之类的工具。