在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之类的工具。

bannerAds