728x90
반응형
간단한 키워드 검색은 SQL의 LIKE
만으로도 충분합니다.
하지만 수만 건 이상의 데이터, 정렬, 유사도 기반 검색, 오타 허용까지 원한다면?
이럴 때 필요한 게 바로 ElasticSearch입니다.
이번 글에서는 Rails에 ElasticSearch를 연동하여 고급 검색 기능을 구현하는 과정을 설명하고, 단순 텍스트 검색을 넘어 자연어 기반, 정렬, 자동완성 등 다양한 기능을 어떻게 구현하는지 살펴볼게요.
🔧 1. 설치 및 기본 설정
ElasticSearch 설치 (로컬 테스트용)
# macOS (Homebrew)
$ brew install elasticsearch
$ brew services start elasticsearch
기본 포트는 9200
이며, http://localhost:9200
에서 실행 상태를 확인할 수 있습니다.
Gem 설치
# Gemfile
gem 'elasticsearch-model'
gem 'elasticsearch-rails'
$ bundle install
📄 2. 모델에 검색 기능 추가
예를 들어 Post
모델에 검색을 붙이고 싶다면 다음처럼 설정합니다.
# app/models/post.rb
class Post < ApplicationRecord
include Elasticsearch::Model
include Elasticsearch::Model::Callbacks
end
Callbacks
모듈은 create/update/delete 시 자동으로 인덱스를 갱신해줍니다.
인덱스 생성
$ rails c
> Post.__elasticsearch__.create_index!
> Post.import
🔍 3. 기본 검색 구현
컨트롤러 예시
def search
if params[:q].present?
@results = Post.search(params[:q])
else
@results = Post.none
end
end
뷰 예시
<%= form_with url: search_posts_path, method: :get do %>
<%= text_field_tag :q, params[:q] %>
<%= submit_tag "검색" %>
<% end %>
<% @results&.each do |post| %>
<p><%= post.title %></p>
<% end %>
⚙️ 4. 커스텀 매핑 및 검색 옵션
한글 검색 향상을 위한 n-gram 설정
settings index: {
analysis: {
tokenizer: {
ngram_tokenizer: {
type: 'nGram',
min_gram: 2,
max_gram: 3,
token_chars: ['letter', 'digit']
}
},
analyzer: {
ngram_analyzer: {
type: 'custom',
tokenizer: 'ngram_tokenizer',
filter: ['lowercase']
}
}
}
} do
mappings dynamic: false do
indexes :title, type: 'text', analyzer: 'ngram_analyzer'
end
end
이 설정을 사용하면 오타나 일부 글자만 입력해도 검색 결과가 유사하게 나옵니다.
📈 5. 정렬, 필터, 페이지네이션
정렬 예시
Post.search({
query: { match: { title: 'rails' } },
sort: [{ created_at: { order: 'desc' } }]
})
페이지네이션 예시
Post.search({
query: { match_all: {} },
from: 0, size: 10
})
🧠 6. 실전 팁
- ElasticSearch는 DB가 아닌 검색 전용 엔진입니다.
- 데이터가 바뀌면 자동으로 인덱스를 갱신하는 설정이 중요합니다.
- 검색 품질을 높이려면 analyzer, tokenizer, synonym 설정을 적극 활용하세요.
🎯 마치며
ElasticSearch는 단순한 키워드 검색을 넘어 추천, 자동완성, 유사도 정렬까지 구현할 수 있는 매우 강력한 도구입니다.
Rails에서도 elasticsearch-model
만으로 비교적 간단하게 통합할 수 있기 때문에, 검색 품질이 중요한 서비스라면 반드시 도입을 고려해보세요.
728x90
반응형
'Ruby On Rails' 카테고리의 다른 글
GraphQL with Rails — REST를 넘어서 (0) | 2025.08.19 |
---|---|
API 서버로서의 Rails — Rails + React/Vue 조합 만들기 (2) | 2025.08.14 |
Rails 캐싱 전략 — 페이지, 프래그먼트, 러시아 인형 캐시 (3) | 2025.08.12 |
Rails에서 환경변수 관리 — dotenv와 secrets.yml (3) | 2025.08.07 |
Capistrano로 자동 배포 파이프라인 만들기 (2) | 2025.08.05 |