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'
スクリーンショット 2020-12-06 17.02.33.png

在 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

广告
将在 10 秒后关闭
bannerAds