尝试使用Ruby on Rails中的Elasticsearch进行各种搜索。第一部分
因为我自己陷入其中,所以我会写下来。
描述需要花费很多成本,所以每次都会随便搞一搞。。。好失望(´・ω・`)
这是关于使用Elasticsearch并尝试在Rails5中实现WEB界面的事情。
我之前一直觉得在RoR和ES中管理Model很麻烦啊,
然后我发现了有一个叫做elasticsearch的gem。
这个应该可以用吧。所以我尝试使用时发现有些地方没有整理好,所以写下来说明一下。
服务器环境
我使用的环境如下所示。
操作系统:Centos 6.8
编辑器: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 => Gem 文件
需要先假设RoR已经被安装好。
在Gemfile中添加以下四个Gem文件。
$ 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]
设置文件 (shè
请设置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’が何かのエラーで必要だったが、、、忘れたので割愛、気分が出たら調べます。
在Ruby on Rails中进行设置
我将描述如何在 RoR 的 model、controller 和 view 中使用的方法。
模型设置
以下是关于指定ES索引的描述内容。
此外,并非只能使用concerns目录,也可以使用../目录。
$ cat ./app/models/concerns/xxx.rb
class Xxx < ApplicationRecord
include Elasticsearch::Model ### こいつが重要
index_name "es_#{Rails.env}" ### 環境別にしてみる。
document_type 'test' ### 書かなくてもOK 今回は一応
end
请参考 Rails Webook 的页面来进行后续的基本配置。
用控制器调用。
假设在上述设定的Xxx模型中,存在如下的方法。
$ cat ./app/models/concerns/xxx.rb
[snip]
def self.search(params = {})
keyword = params[:q]
[snip]
end
在这种情况下,您可以在控制器中进行以下调用。
$ cat app/controllers/test_controller.rb
def index
@searchs = Xxx.search(params)
end
在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
请告诉我是否能够以类似的方式显示。
因为之前有一些写过但这次最终确认未完成的代码,请如有任何意见,请指出。
下次,我们将描述本次未触及的聚合部分。