AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。

MongoDB 検索クエリを実行する

このチュートリアルでは、高度な全文検索機能である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

次に、次の設定アクションを実行します。

  1. MongoDB Atlasクラスターを作成します。クラスターの作成方法については、 Rails クイック スタートガイドの「プロジェクトを設定する」ステップを参照してください。

  2. 次の設定例のように、アプリの config/mongoid.yml ファイルを独自の接続文字列で更新し、デフォルトのデータベースを inspiration に設定します。

    development: clients: default: uri: mongodb+srv://<username>:<password>@<host>/inspiration
  3. rails server コマンドを実行して Railsアプリを起動し、New Idea 入力フォームに入力してサンプルデータを inspiration.ideas コレクションに挿入します。

    Tip

    サンプル データ

    チュートリアルの後半で説明される検索機能を実現するためには、name フィールドまたは description フィールドに重複する用語を含むサンプル ドキュメントを挿入します。

  4. 動的(デフォルト)マッピングを使用して、Compass または Atlas UI で inspiration と呼ばれる MongoDB 検索インデックスを作成します。MongoDB Search インデックスの作成の詳細については、インデックスガイドのMongoDB Search インデックスセクションを参照してください。

1

まず、モデルで 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 endend

idea.search("<example query>") を呼び出すと、Mongoid は以下のアクションを実行します。

  1. inspirationインデックスを使用して全文検索を実行します。

  2. name フィールドと description フィールドにわたってクエリを実行します。

  3. 関連性スコアで結果を並べ替えます。

  4. 大規模なコレクションに対するクエリのパフォーマンスを向上させるために、結果の数を 20 に制限します。

search_results 変数は、MongoDB の未処理の結果をIdea モデルインスタンスにマッピングし、ビューファイルにレンダリングできるハッシュの配列に変換します。

2

Idea モデルで検索クエリ機能を定義したので、クエリを開始するためのアクションを追加しなければなりません。

app/controllers/ideas_controller.rb ファイルを開き、private 宣言の前に次のアクションをIdeasController に追加してください。

def search @query = params[:query] @ideas = @query.present? ? Idea.search(@query) : Idea.all render :display_resultsend

これで、検索クエリを送信すると、Mongoid は Idea モデルで search メソッドを実行するようになります。結果はビューファイルにレンダリングされます。

3

次のコマンドを実行して、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) endend

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;}
4

アプリケーションで検索クエリを直接有効にするには、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;}
5

検索結果を表示するために、config/routes.rb ファイル内の既存のルートを次のルートに置き換えます。

Rails.application.routes.draw do root to: "ideas#index" resources :ideas get '/search_results', to: 'searches#display_results', as: "search_results"end
6

プロジェクト ディレクトリ内で、次のコマンドを実行してアプリケーションを起動します。

rails server

ランディング ページを表示するには、http://127.0.0.1:3000/ にアクセスしてください。

クエリを送信するには、検索バーに用語またはフレーズを入力し、Search ボタンをクリックします。次の画像は、"outdoor" という検索用語の検索結果を示しています。

表示された検索結果

検索結果は、データベース内のドキュメントによって異なります。データの複雑さが増す。結果を絞り込むには、より高度なクエリを実行する必要がある場合があります。さまざまなMongoDB Search 検索クエリとビューの例の詳細については、Atlas ドキュメントの 検索クエリ参照 を参照してください。

このチュートリアルでは、MongoDB 検索する 機能を Railsアプリケーションに統合する方法を学びました。この統合により、ユーザーのンゲージメントが改善され、使いやすさと機能が向上します。

Mongoid でクエリを指定する方法を学ぶには、ドキュメント クエリの指定を参照してください。