MongoDB.local SF, Jan 15: See the speaker lineup & ship your AI vision faster. Use WEB50 to save 50%
Find out more >
Docs Menu
Docs Home
/ /

MongoDB Search の統合

このチュートリアルでは、高度な全文検索機能である 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 クイック スタート ガイドの「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 または と呼ばれる Atlas UIでMongoDBinspiration Searchインデックスを作成します。 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
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" という検索用語の検索結果を示しています。

表示された検索結果

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

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

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

戻る

ネストされた属性