Overview
このチュートリアルでは、高度な全文検索機能である MongoDB Search をRuby on Railsアプリに統合する方法を学びます。
このチュートリアルを完了すると、Rails アプリに完全に機能する検索機能が埋め込まれ、効率的に情報を検索することができます。
前提条件
このチュートリアルは、次のコマンドを実行して mongodb-atlas-with-ruby-on-rails-example GitHub リポジトリ からダウンロードできるテンプレートアプリに基づいています。
git clone https://github.com/mongodb-developer/mongodb-atlas-with-ruby-on-rails-example.git
次に、次の設定アクションを実行します。
MongoDB Atlas クラスターを作成します。クラスターの作成方法については、Rails クイック スタート ガイドの「MongoDB 配置の作成 - Ruby on Rails」の手順を参照してください。
次の設定例のように、アプリの
config/mongoid.ymlファイルを独自の接続文字列で更新し、デフォルトのデータベースをinspirationに設定します。development: clients: default: uri: mongodb+srv://<username>:<password>@<host>/inspiration rails serverコマンドを実行して Railsアプリを起動し、New Idea 入力フォームに入力してサンプルデータをinspiration.ideasコレクションに挿入します。Tip
サンプル データ
チュートリアルの後半で説明される検索機能を実現するためには、
nameフィールドまたはdescriptionフィールドに重複する用語を含むサンプル ドキュメントを挿入します。動的(デフォルト)マッピングを使用して、Compass または と呼ばれる Atlas UIでMongoDB
inspirationSearchインデックスを作成します。 MongoDB Search インデックスの作成の詳細については、「 インデックスガイド 」の「 MongoDB Search インデックス 」セクションを参照してください。
手順
Mongoid モデルでMongoDB Search 機能を構成します。
まず、モデルで search メソッドを定義し、ideasコレクションのMongoDB 検索クエリを取り扱うように Idea モデルを更新します。メソッド self.search(query) は、単一の引数 query を受け取り、検索結果を返す search というクラスメソッドを定義します。
app/models/idea.rb ファイルを開き、その内容を次のコードで置き換えます。
class Idea include Mongoid::Document include Mongoid::Timestamps field :name, type: String field :description, type: String field :picture, type: String def self.search(query) aggregation_pipeline = [ { "$search": { "index": "inspiration", "text": { "query": query, "path": ['name', 'description'] }, "sort": { "score": { "$meta": "searchScore" } } } }, { "$limit": 20 } ] results = collection.aggregate(aggregation_pipeline) search_results = results.to_a search_results.map do |result| Idea.new( id: result["_id"], name: result["name"], description: result["description"], picture: result["picture"] ) end end end
idea.search("<example query>") を呼び出すと、Mongoid は以下のアクションを実行します。
inspirationインデックスを使用して全文検索を実行します。nameフィールドとdescriptionフィールドにわたってクエリを実行します。関連性スコアで結果を並べ替えます。
大規模なコレクションに対するクエリのパフォーマンスを向上させるために、結果の数を
20に制限します。
search_results 変数は、MongoDB の未処理の結果をIdea モデルインスタンスにマッピングし、ビューファイルにレンダリングできるハッシュの配列に変換します。
コントローラーに検索アクションを追加します。
Idea モデルで検索クエリ機能を定義したので、クエリを開始するためのアクションを追加しなければなりません。
app/controllers/ideas_controller.rb ファイルを開き、private 宣言の前に次のアクションをIdeasController に追加してください。
def search @query = params[:query] @ideas = @query.present? ? Idea.search(@query) : Idea.all render :display_results end
これで、検索クエリを送信すると、Mongoid は Idea モデルで search メソッドを実行するようになります。結果はビューファイルにレンダリングされます。
検索コントローラーを生成してください。
次のコマンドを実行して、SearchesController と display_results のビュー ファイルを生成します。それぞれが search リクエストを取り扱い、結果を表示します。
rails generate controller Searches display_results
新しく作成された searches_controller.rb ファイルを開き、その内容を次のコードで置き換えます。
class SearchesController < ApplicationController def display_results query = params[:query] @results = Idea.search(query) end end
app/views/searches/display_results.html.erb ファイルを開き、その内容を次のコードに置き換えて、検索結果を表示します。
<div class="search-results"> <h1>Search Results for "<%= params[:query] %>"</h1> <% if @results.empty? %> <p>No ideas found.</p> <% else %> <div class="idea-container"> <% @results.each do |result| %> <div class="idea"> <h2><%= result.name %></h2> <p><%= truncate(result.description, length: 150) %></p> <img src="<%= result.picture %>" alt="<%= result.name %>" /> <p><%= link_to "View", idea_path(result.id) %></p> </div> <% end %> </div> <% end %> </div> <%= link_to "Back", ideas_path %>
次に、検索結果の基本スタイルを含めるために、次のコードを app/assets/stylesheets/application.css ファイルに追加します。
.search-results { width: 80%; margin: 0 auto; } .idea-container { display: flex; flex-direction: column; } .idea { padding: 20px; border-bottom: 2px solid #ccc; border-radius: 10px 10px 0 0; margin-bottom: 10px; } .idea h2 { margin: 0; } .idea p { margin: 0; } .idea img { width: 100px; height: auto; display: block; } ul { list-style-type: none; padding: 0; }
検索フォームを作成してください。
アプリケーションで検索クエリを直接有効にするには、app/views/ideas/index.html.erb ファイルを開き、次のコードを追加します。
<%= form_tag(search_results_path, method: :get, class: "form-inline") do %> <div class="input-group mb-3"> <%= text_field_tag :query, params[:query], placeholder: "Search Ideas...", class: "form-control" %> <div class="input-group-append"> <%= submit_tag "Search", class: "btn btn-primary text-white" %> </div> </div> <% end %>
検索バーの次のスタイルを application.css ファイルに追加します。
.input-group { width: 100%; } .btn-primary { background-color: #007bff; border-color: #007bff; color: white; } .btn-primary:hover { background-color: #0056b3; border-color: #004085; }
アプリケーションを起動し、検索クエリを実行します。
プロジェクト ディレクトリ内で、次のコマンドを実行してアプリケーションを起動します。
rails server
ランディング ページを表示するには、http://127.0.0.1:3000/ にアクセスしてください。
クエリを送信するには、検索バーに用語またはフレーズを入力し、Search ボタンをクリックします。次の画像は、"outdoor" という検索用語の検索結果を示しています。

検索結果は、データベース内のドキュメントによって異なります。データの複雑さが増す。結果を絞り込むには、より高度なクエリを実行する必要がある場合があります。さまざまなMongoDB Search クエリとビューの例の詳細については、Atlas ドキュメントの クエリ リファレンス を参照してください。
まとめ
このチュートリアルでは、 MongoDB Search 機能を Railsアプリケーションに統合する方法を学びました。この統合により、ユーザーとの連携が改善され、使いやすさと機能が向上します。