Overview
このチュートリアルでは、高度な全文検索機能である Atlas 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 または
inspiration
と呼ばれる Atlas UI で Atlas Search インデックスを作成します。Atlas Search 検索インデックスの作成の詳細については、インデックスガイドの「Atlas Search インデックス」セクションを参照してください。
手順
Mongoid モデルで Atlas Search 機能を構成します。
まず、モデルで search
メソッドを定義し、ideas
コレクションの Atlas Search クエリを処理するように 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"
という検索用語の検索結果を示しています。

検索結果は、データベース内のドキュメントによって決まります。データの複雑さが増すにつれて、より高度なクエリを実行して結果を絞り込む必要がある場合があります。さまざまな Atlas Search クエリの詳細や使用例については、Atlas ドキュメントの「クエリ リファレンス」をご覧ください。
まとめ
このチュートリアルでは、Atlas Search 機能をRails アプリケーションに統合する方法を学びました。この統合により、ユーザーの利便性と機能性が向上し、エンゲージメントの強化にもつながります。