環境
MacOS
RailsServer
Ruby 2.4.1
Ruby on Rails 5.1.7
MySQL
Elasticsearch 7.10.2-SNAPSHOT
kuromoji
※ローカル環境です
実現したいこと・前置き
ElasticSearchを使って既存のMySQLのレコードを取り込み、全文検索を高速化させたいです。
現在下記の記事とサンプルコードを参考にElasticSearchの実装を行っています。
Rails6でElasticsearchのキーワード検索実装ハンズオン
RailsとElasticsearchで検索機能をつくり色々試してみる - その1:サンプルアプリケーションの作成
rails_es_sample
記事を参考に、レコードをElasticSearchに取り込むことはできたと思います。
curl 'localhost:9200/_cat/indices?v' health status index uuid pri rep docs.count docs.deleted store.size pri.store.size yellow open es_project_development Fpu_adXWT9Gtw7KZTh0aDw 1 1 6804 0 3.7mb 3.7mb
ElasticSearchのindexやmappingの設定は以下のようにしました。
なお、models/project.rb内は
class Project < ApplicationRecord include ProjectSearchable ... ```のようにしております。
/models/concerns/project_searchable.rb
module ProjectSearchable
extend ActiveSupport::Concern
included do include Elasticsearch::Model index_name "es_project_#{Rails.env}" settings do mappings dynamic: 'false' do indexes :id, type: 'integer' indexes :title, type: 'text', analyzer: 'kuromoji' indexes :contents, type: 'text', analyzer: 'kuromoji' indexes :industry, type: 'text'
...
def as_indexed_json(*) attributes .symbolize_keys .slice(:id, :title, :contents, :industry, ...) end end class_methods do def create_index! client = __elasticsearch__.client client.indices.delete index: self.index_name rescue nil client.indices.create(index: self.index_name, body: { settings: self.settings.to_hash, mappings: self.mappings.to_hash }) end def es_search(query) __elasticsearch__.search({ query: { multi_match: { fields: %w(id title contents industry ...), type: 'cross_fields', query: query, operator: 'and' } } }) end end
end
Viewの全文検索はすでに実装されているので、あとはSearchメソッドを使える状態にして、コントローラから呼び出せばElasticSeachが使える状態になると思ってます。 ### 発生している問題 [RailsとElasticsearchで検索機能をつくり色々試してみる - その1:サンプルアプリケーションの作成 ](https://qiita.com/yamashun/items/6ecaa6f161b4cf283db3) 上記の記事を参考にElasticSearchのインデックス内を検索するメソッドを以下のように実装しています。 ```ここに言語を入力 def es_search(query) __elasticsearch__.search({ query: { multi_match: { fields: %w(id title contents industry ...), type: 'cross_fields', query: query, operator: 'and' } } }) end end end
しかし、rails cで
Project.es_search('ゲーム')
のように検索しても以下のように表示され、見た感じデータ検索をしていません。
#<Elasticsearch::Model::Response::Response:0x007fc1a85621a8 @klass=[PROXY] Project (call 'Project.connection' to establish a connection), @search= #<Elasticsearch::Model::Searching::SearchRequest:0x007fc1a8562248 @definition= {:index=>"es_project_development", :type=>nil, :body=> {:query=> {:multi_match=> {:fields=> ["id", "title", "contents", "industry", "required", ... "comment"], :type=>"cross_fields", :query=>"ゲーム", :operator=>"and"}}}}, @klass=[PROXY] Project (call 'Project.connection' to establish a connection), @options={}>>
公式サイトを見ても実装自体は何となくあってる気がします。
ElasticSearch公式
かなりドツボにはまっており、非常に困っています。。
ちなみにViewとControllerは以下のように実装されています。
/views/top/index.html.slim = form_tag search_path, {:method=>"get"} table border="0" tr td = text_field_tag 'keyword[name]', nil, class: 'write' td input.push type="submit" value="" ...
/controllers/projects_controller.rb def search ... @keyword = params.dig('keyword', 'name') params = '' connection = '?' ... if @keyword.present? params = "#{params}#{connection}keyword=#{@keyword}" connection = '&' end ...
何かヒントがあればあっさりいくような気がするんですが、、
どなたかアドバイスいただけると幸いです。
何卒よろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー