Rails×Heroku×bonsai×Searchkick(Elasticsearch)的使用笔记
如果要在Searchkick(Elasticsearch)中针对模型Product进行搜索的话。
gem 'elasticsearch', '7.2.0'
gem 'searchkick'
class Product < ApplicationRecord
searchkick language: "japanese"
def search_data
{
keywords: keywords
}
end
end
class HomeController < ApplicationController
def top
end
def search
@products = self.products_query
end
private
def products_query
if params[:q].present?
Product.search params[:q], fields: [:keywords], body_options: {min_score: 1}, operator: "or"
else
Product.all.order(id: "desc")
end
end
end
引入Elasticsearch
这个地方是上一次开发时放进去的。
这个地方是在之前的开发中添加的。
仅仅使用 brew install elasticsearch 是不够的,我记得是在 Elasticsearch 官方网站上查看指南安装的。
https://www.elastic.co/guide/en/elasticsearch/reference/7.10/brew.html
$ which elasticsearch
-> usr/local/bin/elasticsearch #私の場合はこのディレクトリに入っていました
在本地进行开发
如果Elasticsearch已经安装好了,只需启动并生成索引即可在搜索结果中显示出来。
# Elasticsearchを起動
$ elasticsearch
# 新規タブでkibanaを起動(任意)
$ kibana
# 新規タブでローカルサーバーを起動
$ rails s
# Rails Console でインデックスを生成
$ rails c
irb(main):001:0> Product.reindex # 検索対象となるモデル名がProductの場合
生产 Heroku
将Bonsai附加到Heroku上
只需要在图形用户界面上单击一下,就可以自动进行添加和设置环境变量BONSAI_URL。然而,需要手动设置环境变量ELASTICSEARCH_URL为相同的值。
$ heroku config:get BONSAI_URL -a myapp
-> http://username123:password123@my-awesome-cluster-94865.us-east-1.bonsai.net:443
$ heroku config:add ELASTICSEARCH_URL='http://username123:password123@my-awesome-cluster-94865.us-east-1.bonsaisearch.net:443'
在 Bonsai 公式文档中,URL 示例为 xxx.bonsai.io 的域名,但我的是 xxx.bonsaisearch.net:443。请确保你也正确设置了尾号的数字。
创建索引
$ heroku run rails searchkick:reindex CLASS=Product -a myapp # 対象モデルがProductの場合
# もしくは
$ heroku run rails searchkick:reindex:all -a myapp
如果使用rake完成,根据Elasticsearch的版本可能会出现一些问题(可能会出现Searchkick::ImportError)。
请参阅
Searchkick 是一个开源的 GitHub 项目,网址是 https://github.com/ankane/searchkick
Heroku Bonsai Elasticsearch 文档
https://devcenter.heroku.com/articles/bonsai
Searchkick的README翻译成日文。
https://qiita.com/kentosasa/items/f0af67f62f4692d68370#deployment