🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Elasticsearch

Elasticsearchは、クラウド向けに構築された、RESTful な API を提供する分散型のサーチエンジンアプリケーションです。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

Q&A

解決済

2回答

1808閲覧

Rails環境下でElasticSearchのSearchメソッドの設定をしたい

Hinoarashi.

総合スコア76

Elasticsearch

Elasticsearchは、クラウド向けに構築された、RESTful な API を提供する分散型のサーチエンジンアプリケーションです。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

0グッド

0クリップ

投稿2021/03/25 02:02

編集2021/03/28 02:35

環境

MacOS
RailsServer
Ruby 2.4.1
Ruby on Rails 5.1.7
MySQL
Elasticsearch 7.10.2-SNAPSHOT
kuromoji

<gem> elasticsearch (7.4.0) elasticsearch-api (7.4.0) elasticsearch-model (7.1.0 80822d6) elasticsearch-rails (7.1.0 80822d6) elasticsearch-transport (7.4.0)

※ローカル環境です

実現したいこと・前置き

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 ...

何かヒントがあればあっさりいくような気がするんですが、、
どなたかアドバイスいただけると幸いです。
何卒よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

suama

2021/03/25 04:24

module ProjectSearchable は、Projectクラス (models/project.rbでしょうか?)にincludeする想定でいいでしょうか?
Hinoarashi.

2021/03/25 04:33

ご回答ありがとうございます。 説明漏れており申し訳ございません。 おっしゃる通りです、models/project.rb内にinclude ProjectSearchableを記述しております。
guest

回答2

0

自己解決

解決したので、質問を閉じます。
結局search kickというgemを使って実装を行いました。
詳細はgitのread meをご覧ください。

投稿2021/06/02 08:08

Hinoarashi.

総合スコア76

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こんばんは。質問をさせていただきましたので、何かヒントになれば。

ProjectSearchableProjectクラスにincludeしているので、以下のような呼び出し方ができるようになりますね。
Elasticsearch側に対応するインデックスが出来ていれば、ですが。

もし rails console を使えるのでしたら、コントローラに記載する前に rails consoleで動作確認するといいと思います。

ruby

1 2# 通常のActiveRecordでの検索方法で、industryが通信業のレコードを 3# 取り出す場合 4# こちらだとデータベースに問合せに行く 5Project.where(industry: '通信業') 6 7# Elasticsearchを使う場合 8# うまく連携できていれば、ElasticSearch側のログにGET リクエストが出ているはず 9Project.es_search('通信業') 10

投稿2021/03/25 13:30

suama

総合スコア1997

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Hinoarashi.

2021/03/26 02:32 編集

ご回答ありがとうございます! ホントに初心者で申し訳ないのですが、Elasticsearch側のログはどのように見ればよろしいでしょうか? 一応、rails c をして、Project.es_search('ゲーム') でコマンドを打つと以下のように返ってきました。 ぱっと見、何もデータを取ってきてないように思えますが、、 ※ゲームというキーワードはDB内のレコードに存在します ------ 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={}>>
suama

2021/03/26 11:17

Elasticsearch側にインデックスを作っていないと、データは取れないとは思いますが、とりあえず接続確認をしないといけませんね。 docker-compose up -d でElasticsearchを起動しているようなので、-d オプションを外して、docker-compose up で上げ直すと、ターミナルにログが流れます。
Hinoarashi.

2021/03/26 12:09

ご回答ありがとうございます。 非常に申し訳ございません。。 dockerは入れてません、、(正確に言うと必要がないことが判明し、関連ファイルごと全て削除いたしました) また、調べたところ、やはりインデックスであるes_project_development内にデータは入っており、恐らく「es_search」のメソッドが機能していないため、コントローラでメソッドを与えてもデータを引っ張ってこないのだと思います。 公式サイトを見てみましたが、メソッドを定義しているコードのmulti_match、fields、type、queryなどは合ってる気がします。 ElasticSearchサイト:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-multi-match-query.html ------- def es_search(query) __elasticsearch__.search({ query: { multi_match: { fields: %w(id title contents industry ...), type: 'cross_fields', query: query, operator: 'and' } } }) end end ------- 何かまだ定義しないといけないコードが欠けているのかなと個人的には思っています。 本日1日中調べ続けましたが、エンジニアを始めたばっかりということもあり、なかなか手がかりを見つけ出せません。。 頼れる人もいないので、どうかヒントだけでもいただけると非常にありがたいです、、 何卒よろしくお願いいたします。
suama

2021/03/26 13:42

失礼しました。 では、ElasticsearchもMySQLもRailsも、それぞれローカル開発環境?で直に起動している感じでしょうか? そのあたりが正確にわかれば、他の方からのコメントもあるかもしれませんので、質問のところに情報を添えると良いかなと思います。 MacOSを使っているとか、レンタルサーバ上で起動している、など。 いずれにしても、正しくRails側の設定、モジュールの定義が出来ていれば、Elasticsearch側のログに、Railsからのアクセスログが出てくるかと思います。 ログの場所は、インストール方法やOSによって変わるので、この手の質問はOS情報もあると大変助かります。 elasticsearch.yml という設定ファイルがあれば、そこにログの出力場所が書いてあるかもしれませんので。
Hinoarashi.

2021/03/26 14:43

お返事ありがとうございます。。 >では、ElasticsearchもMySQLもRailsも、それぞれローカル開発環境?で直に起動している感じでしょうか? はい、おっしゃるとおりです。 ElasticSearchは $elasticsearch -d で起動し、Mysqlはdatabase.ymlから読み取って起動しております。 >MacOSを使っているとか、レンタルサーバ上で起動している、など。 こちらはMacOSを使用しており、サーバーはrails serverです。 本番はEC2を使用しております。 >elasticsearch.yml という設定ファイルがあれば、そこにログの出力場所が書いてあるかもしれませんので。 申し訳ないです、、 elasticsearch.ymlは作成すらしておりません。。 必要なのでしょうか。。 ご指摘あった質問内容を更新させていただきました。 大変お手数おかけしますが、何卒よろしくお願いいたします。
Hinoarashi.

2021/03/29 03:28

すいません。 elasticsearch.ymlとログを発見いたしました。 ===== 【elasticsearch.yml】 # ---------------------------------- Cluster ----------------------------------- # # Use a descriptive name for your cluster: # cluster.name: elasticsearch_brew # # ------------------------------------ Node ------------------------------------ # # Use a descriptive name for the node: # #node.name: node-1 # # Add custom attributes to the node: # #node.attr.rack: r1 # # ----------------------------------- Paths ------------------------------------ # # Path to directory where to store the data (separate multiple locations by comma): # path.data: /usr/local/var/lib/elasticsearch/ # # Path to log files: # path.logs: /usr/local/var/log/elasticsearch/ ===== 【ログ】 [2021-03-29T12:04:21,724][INFO ][o.e.n.Node ] [TatsurunoMacBook-Pro.local] version[7.10.2-SNAPSHOT], pid[21368], build[oss/tar/unknown/2021-01-16T01:41:27.115673Z], OS[Mac OS X/11.2.3/x86_64], JVM[Oracle Corporation/OpenJDK 64-Bit Server VM/15.0.2/15.0.2+7] [2021-03-29T12:04:21,740][INFO ][o.e.n.Node ] [TatsurunoMacBook-Pro.local] JVM home [/usr/local/Cellar/openjdk/15.0.2/libexec/openjdk.jdk/Contents/Home] [2021-03-29T12:04:21,747][INFO ][o.e.n.Node ] [TatsurunoMacBook-Pro.local] JVM arguments [-Xshare:auto, -Des.networkaddress.cache.ttl=60, -Des.networkaddress.cache.negative.ttl=10, -XX:+AlwaysPreTouch, -Xss1m, -Djava.awt.headless=true, -Dfile.encoding=UTF-8, -Djna.nosys=true, -XX:-OmitStackTraceInFastThrow, -XX:+ShowCodeDetailsInExceptionMessages, -Dio.netty.noUnsafe=true, -Dio.netty.noKeySetOptimization=true, -Dio.netty.recycler.maxCapacityPerThread=0, -Dio.netty.allocator.numDirectArenas=0, -Dlog4j.shutdownHookEnabled=false, -Dlog4j2.disable.jmx=true, -Djava.locale.providers=SPI,COMPAT, -Xms1g, -Xmx1g, -XX:+UseG1GC, -XX:G1ReservePercent=25, -XX:InitiatingHeapOccupancyPercent=30, -Djava.io.tmpdir=/var/folders/my/g2_3q6v12f753sjt2x5lhj8m0000gn/T/elasticsearch-14931965270566397954, -XX:+HeapDumpOnOutOfMemoryError, -XX:HeapDumpPath=data, -XX:ErrorFile=logs/hs_err_pid%p.log, -Xlog:gc*,gc+age=trace,safepoint:file=/usr/local/var/log/elasticsearch/gc.log:utctime,pid,tags:filecount=32,filesize=64m, -XX:MaxDirectMemorySize=536870912, -Des.path.home=/usr/local/Cellar/elasticsearch/7.10.2/libexec, -Des.path.conf=/usr/local/etc/elasticsearch, -Des.distribution.flavor=oss, -Des.distribution.type=tar, -Des.bundled_jdk=false] [2021-03-29T12:04:21,748][WARN ][o.e.n.Node ] [TatsurunoMacBook-Pro.local] version [7.10.2-SNAPSHOT] is a pre-release version of Elasticsearch and is not suitable for production [2021-03-29T12:04:22,728][INFO ][o.e.p.PluginsService ] [TatsurunoMacBook-Pro.local] loaded module [aggs-matrix-stats] [2021-03-29T12:04:22,728][INFO ][o.e.p.PluginsService ] [TatsurunoMacBook-Pro.local] loaded module [analysis-common] [2021-03-29T12:04:22,728][INFO ][o.e.p.PluginsService ] [TatsurunoMacBook-Pro.local] loaded module [geo] [2021-03-29T12:04:22,729][INFO ][o.e.p.PluginsService ] [TatsurunoMacBook-Pro.local] loaded module [ingest-common] [2021-03-29T12:04:22,729][INFO ][o.e.p.PluginsService ] [TatsurunoMacBook-Pro.local] loaded module [ingest-geoip] [2021-03-29T12:04:22,729][INFO ][o.e.p.PluginsService ] [TatsurunoMacBook-Pro.local] loaded module [ingest-user-agent] [2021-03-29T12:04:22,729][INFO ][o.e.p.PluginsService ] [TatsurunoMacBook-Pro.local] loaded module [kibana] [2021-03-29T12:04:22,729][INFO ][o.e.p.PluginsService ] [TatsurunoMacBook-Pro.local] loaded module [lang-expression] [2021-03-29T12:04:22,729][INFO ][o.e.p.PluginsService ] [TatsurunoMacBook-Pro.local] loaded module [lang-mustache] [2021-03-29T12:04:22,730][INFO ][o.e.p.PluginsService ] [TatsurunoMacBook-Pro.local] loaded module [lang-painless] [2021-03-29T12:04:22,730][INFO ][o.e.p.PluginsService ] [TatsurunoMacBook-Pro.local] loaded module [mapper-extras] [2021-03-29T12:04:22,730][INFO ][o.e.p.PluginsService ] [TatsurunoMacBook-Pro.local] loaded module [parent-join] [2021-03-29T12:04:22,730][INFO ][o.e.p.PluginsService ] [TatsurunoMacBook-Pro.local] loaded module [percolator] [2021-03-29T12:04:22,730][INFO ][o.e.p.PluginsService ] [TatsurunoMacBook-Pro.local] loaded module [rank-eval] [2021-03-29T12:04:22,730][INFO ][o.e.p.PluginsService ] [TatsurunoMacBook-Pro.local] loaded module [reindex] [2021-03-29T12:04:22,731][INFO ][o.e.p.PluginsService ] [TatsurunoMacBook-Pro.local] loaded module [repository-url] [2021-03-29T12:04:22,731][INFO ][o.e.p.PluginsService ] [TatsurunoMacBook-Pro.local] loaded module [test-delayed-aggs] [2021-03-29T12:04:22,731][INFO ][o.e.p.PluginsService ] [TatsurunoMacBook-Pro.local] loaded module [transport-netty4] [2021-03-29T12:04:22,731][INFO ][o.e.p.PluginsService ] [TatsurunoMacBook-Pro.local] loaded plugin [analysis-kuromoji] [2021-03-29T12:04:22,769][INFO ][o.e.e.NodeEnvironment ] [TatsurunoMacBook-Pro.local] using [1] data paths, mounts [[/System/Volumes/Data (/dev/disk1s1)]], net usable_space [814.6gb], net total_space [931.5gb], types [apfs] [2021-03-29T12:04:22,770][INFO ][o.e.e.NodeEnvironment ] [TatsurunoMacBook-Pro.local] heap size [1gb], compressed ordinary object pointers [true] [2021-03-29T12:04:22,891][INFO ][o.e.n.Node ] [TatsurunoMacBook-Pro.local] node name [TatsurunoMacBook-Pro.local], node ID [SGzJwqA-SvileDBoJA834Q], cluster name [elasticsearch_brew], roles [master, remote_cluster_client, data, ingest] [2021-03-29T12:04:25,856][INFO ][o.e.t.NettyAllocator ] [TatsurunoMacBook-Pro.local] creating NettyAllocator with the following configs: [name=unpooled, suggested_max_allocation_size=256kb, factors={es.unsafe.use_unpooled_allocator=null, g1gc_enabled=true, g1gc_region_size=1mb, heap_size=1gb}] [2021-03-29T12:04:25,921][INFO ][o.e.d.DiscoveryModule ] [TatsurunoMacBook-Pro.local] using discovery type [zen] and seed hosts providers [settings] [2021-03-29T12:04:26,145][WARN ][o.e.g.DanglingIndicesState] [TatsurunoMacBook-Pro.local] gateway.auto_import_dangling_indices is disabled, dangling indices will not be automatically detected or imported and must be managed manually [2021-03-29T12:04:26,280][INFO ][o.e.n.Node ] [TatsurunoMacBook-Pro.local] initialized [2021-03-29T12:04:26,288][INFO ][o.e.n.Node ] [TatsurunoMacBook-Pro.local] starting ... [2021-03-29T12:04:26,442][INFO ][o.e.t.TransportService ] [TatsurunoMacBook-Pro.local] publish_address {127.0.0.1:9300}, bound_addresses {[::1]:9300}, {127.0.0.1:9300} [2021-03-29T12:04:26,770][WARN ][o.e.b.BootstrapChecks ] [TatsurunoMacBook-Pro.local] the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured [2021-03-29T12:04:26,771][INFO ][o.e.c.c.Coordinator ] [TatsurunoMacBook-Pro.local] cluster UUID [SwvPdx0WSkGyVQEU1apsXw] [2021-03-29T12:04:26,780][INFO ][o.e.c.c.ClusterBootstrapService] [TatsurunoMacBook-Pro.local] no discovery configuration found, will perform best-effort cluster bootstrapping after [3s] unless existing master is discovered [2021-03-29T12:04:26,951][INFO ][o.e.c.s.MasterService ] [TatsurunoMacBook-Pro.local] elected-as-master ([1] nodes joined)[{TatsurunoMacBook-Pro.local}{SGzJwqA-SvileDBoJA834Q}{659ro0p8RKu4yEhDcSvSag}{127.0.0.1}{127.0.0.1:9300}{dimr} elect leader, _BECOME_MASTER_TASK_, _FINISH_ELECTION_], term: 25, version: 217, delta: master node changed {previous [], current [{TatsurunoMacBook-Pro.local}{SGzJwqA-SvileDBoJA834Q}{659ro0p8RKu4yEhDcSvSag}{127.0.0.1}{127.0.0.1:9300}{dimr}]} [2021-03-29T12:04:27,048][INFO ][o.e.c.s.ClusterApplierService] [TatsurunoMacBook-Pro.local] master node changed {previous [], current [{TatsurunoMacBook-Pro.local}{SGzJwqA-SvileDBoJA834Q}{659ro0p8RKu4yEhDcSvSag}{127.0.0.1}{127.0.0.1:9300}{dimr}]}, term: 25, version: 217, reason: Publication{term=25, version=217} [2021-03-29T12:04:27,070][INFO ][o.e.h.AbstractHttpServerTransport] [TatsurunoMacBook-Pro.local] publish_address {127.0.0.1:9200}, bound_addresses {[::1]:9200}, {127.0.0.1:9200} [2021-03-29T12:04:27,070][INFO ][o.e.n.Node ] [TatsurunoMacBook-Pro.local] started [2021-03-29T12:04:27,173][INFO ][o.e.g.GatewayService ] [TatsurunoMacBook-Pro.local] recovered [1] indices into cluster_state [2021-03-29T12:04:27,966][INFO ][o.e.c.r.a.AllocationService] [TatsurunoMacBook-Pro.local] Cluster health status changed from [RED] to [YELLOW] (reason: [shards started [[es_project_development][0]]]).
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問