Docs Menu
Docs Home
/ /

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 컬렉션에 샘플 데이터를 삽입합니다.

    샘플 데이터

    튜토리얼 후반부에 설명된 검색 기능을 구현하려면 name 또는 description 필드에 일부 겹치는 텀이 포함된 샘플 문서를 삽입합니다.

  4. Compass 또는 Atlas UI에서 동적(기본값) 매핑을 사용해 inspiration이라는 Atlas Search 인덱스를 생성합니다. Atlas 검색 인덱스 생성 방법의 자세한 내용은 인덱스 가이드의 Atlas 검색 인덱스 섹션을 참조하세요.

1

먼저 모델에 search 메서드를 정의하여 Idea 모델이 ideas 컬렉션의 Atlas Search 쿼리를 처리할 수 있도록 업데이트하세요. 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. namedescription 필드 전체에 대해 실행됩니다.

  3. 결과를 관련성 점수에 따라 정렬합니다.

  4. 대규모 컬렉션의 쿼리 성능을 개선하기 위해 결과를 20개로 제한합니다.

그 후 search_results 변수는 MongoDB의 원시 결과를 Idea 모델 인스턴스에 매핑할 수 있는 해시 배열로 변환하고, 이를 뷰 파일에서 렌더링합니다.

2

이제 Idea 모델에서 검색 쿼리 기능을 정의했으므로 쿼리를 실행하는 조치를 추가해야 합니다.

app/controllers/ideas_controller.rb 파일을 열고 IdeasControllerprivate 선언 앞에 다음 조치를 추가합니다.

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 문서의 쿼리 참조를 참조하세요.

이 튜토리얼에서는 Rails 애플리케이션에 Atlas Search 기능을 통합하는 방법을 배웠습니다. 이러한 통합은 사용성과 기능성을 높이고 사용자 참여도를 개선합니다.

Mongoid에서 쿼리를 수행하는 방법에 대해 자세히 알아보려면 데이터와 상호 작용 가이드를 참조하세요.

돌아가기

중첩된 속성

이 페이지의 내용