ElasticSearch를 이용한 고급 검색 기능 구현하기

2025. 8. 21. 09:00·Ruby On Rails
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
'Ruby On Rails' 카테고리의 다른 글
  • GraphQL with Rails — REST를 넘어서
  • API 서버로서의 Rails — Rails + React/Vue 조합 만들기
  • Rails 캐싱 전략 — 페이지, 프래그먼트, 러시아 인형 캐시
  • Rails에서 환경변수 관리 — dotenv와 secrets.yml
코드를 걷는 사람
코드를 걷는 사람
devwanderer 님의 블로그 입니다.
  • 코드를 걷는 사람
    터미널 밖으로 나온 개발자
    코드를 걷는 사람
  • 전체
    오늘
    어제
    • 분류 전체보기
      • Flutter
        • Flutter 게시판 앱 만들기
        • Flutter 뉴스 앱 만들기
        • Flutter 메모 앱 만들기
        • Flutter 캘린더 앱 만들기
        • Flutter 날씨 앱 만들기
      • Next.js
      • Ruby On Rails
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    flutter개발
    table_calendar
    감성앱
    openweather
    뉴스앱
    flutter앱개발
    모바일앱개발
    개발블로그
    flutter디자인
    메모앱
    캘린더앱
    flutter게시판
    다크모드
    Flutter
    rails보안
    RubyOnRails
    날씨앱
    코드를걷는사람
    flutter상태관리
    UIUX
    북마크기능
    Nextjs
    Firebase
    백엔드개발
    ActiveRecord
    flutter기초
    UI디자인
    fluttertips
    flutterui
    정적사이트
  • 최근 댓글

  • 최근 글

  • 반응형
    250x250
  • hELLO· Designed By정상우.v4.10.3
코드를 걷는 사람
ElasticSearch를 이용한 고급 검색 기능 구현하기
상단으로

티스토리툴바