Docs Menu
Docs Home
/ / /
Mongoid
/

Atlas Search を統合する

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

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

  1. MongoDB Atlas クラスターを作成します。クラスターの作成方法については、Rails クイック スタート ガイドの「MongoDB 配置の作成 - Ruby on 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 または inspiration と呼ばれる Atlas UI で Atlas Search インデックスを作成します。Atlas Search 検索インデックスの作成の詳細については、インデックスガイドの「Atlas Search インデックス」セクションを参照してください。

1

まず、モデルで 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 は以下のアクションを実行します。

  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_results
end

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

3

次のコマンドを実行して、SearchesControllerdisplay_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;
}
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" という検索用語の検索結果を示しています。

表示された検索結果

検索結果は、データベース内のドキュメントによって決まります。データの複雑さが増すにつれて、より高度なクエリを実行して結果を絞り込む必要がある場合があります。さまざまな Atlas Search クエリの詳細や使用例については、Atlas ドキュメントの「クエリ リファレンス」をご覧ください。

このチュートリアルでは、Atlas Search 機能をRails アプリケーションに統合する方法を学びました。この統合により、ユーザーの利便性と機能性が向上し、エンゲージメントの強化にもつながります。

Mongoid でのクエリ実行について詳しくは、「データのやり取り」ガイドを参照してください。

戻る

ネストされた属性