루리마 서치(Rurima Search) 구축 및 풀텍스트 검색 엔진 Groonga 활용법

[29S06] How to create Ruby reference manual search Web application with Ruby 1.9 groonga and rroonga

작성자
RubyKaigi
발행일
2025년 10월 05일

핵심 요약

  • 1 루비 레퍼런스 매뉴얼 검색 웹 애플리케이션인 '루리마 서치'의 개발 배경과 주요 기능(드릴다운, SEO 친화적 URL, 캐싱)을 설명합니다.
  • 2 풀텍스트 검색 시스템의 일반적인 구조와 루리마 서치에 적용된 'Groonga' 검색 엔진의 특징, 즉 Senna 대비 개선된 성능, 자체 데이터 저장 기능, 컬럼 지향 스토리지, 서버 모드 지원 등을 소개합니다.
  • 3 Groonga의 스키마 정의 및 데이터 등록, 검색 방법을 Ruby 바인딩인 Runga를 활용한 예시와 함께 상세히 다루며, 실제 애플리케이션 개발에 적용할 수 있는 가이드를 제공합니다.

도입

본 강연은 루비 개발자를 위한 레퍼런스 매뉴얼 검색 웹 애플리케이션인 '루리마 서치(Rurima Search)'의 구축 과정을 소개합니다. 발표자는 먼저 루리마 서치가 무엇인지 설명하고, 이어서 이를 어떻게 만들 수 있는지에 대한 기술적인 접근을 제시합니다. 특히, 루비 레퍼런스 매뉴얼(Rurima)을 효율적으로 검색할 수 있도록 설계된 루리마 서치의 핵심 기능과 사용자 경험 개선을 위한 다양한 기법들을 다룹니다. 또한, 발표자 본인의 개발 이력과 'Rabbit' 및 'Alkai-ro' 프로젝트를 간략히 언급하며 강연의 배경을 제시합니다.

루리마 서치(Rurima Search)의 주요 기능

  • 드릴다운(Drill-down) 기능: 검색 전 예상 결과 수를 미리 보여주어 ‘0건’ 검색을 방지하고, 클릭만으로 조건을 추가/제거할 수 있어 편리합니다. 이는 ‘패싯(Facet)’ 기능으로도 불립니다.

  • SEO 친화적 URL: 검색 쿼리 문자열이 URL 경로에 포함되어 Amazon과 같이 검색 엔진 최적화(SEO) 효과를 높여 Google 등 외부 검색 엔진 노출을 용이하게 합니다.

  • 고속 응답 및 캐싱: 배포 환경에서 캐싱 메커니즘을 적용하여 빠른 응답 속도를 보장합니다. 루리마는 야간 배치 처리를 통해 문서가 업데이트되므로, 동일 쿼리 시 HTML 전체를 캐싱하여 성능을 극대화합니다.

풀텍스트 검색 시스템의 일반적인 구조

풀텍스트 검색 시스템은 검색 대상 수집, 색인(Index) 생성, 검색 인터페이스의 세 단계로 구성됩니다. 루리마 서치는 루비 레퍼런스 매뉴얼(RD 형식)을 대상으로 하며, 크롤러 대신 데이터를 추출하여 Groonga 엔진에 등록하는 ‘인덱서’와 웹 애플리케이션 형태의 ‘인터페이스’를 구축합니다.

Groonga 검색 엔진의 특징 및 장점

루리마 서치는 풀텍스트 검색 엔진으로 ‘Groonga’를 사용합니다. Groonga는 기존 ‘Senna’ 엔진의 개선된 버전으로, 2024년 5월 29일(육(肉)의 날)에 버전 1.0과 Ruby 바인딩 ‘Runga’가 릴리스되었습니다.

  • Senna의 한계 극복: Senna는 색인만 생성하고 데이터는 외부 DB에 저장하여 MySQL의 테이블 잠금(lock)이 실시간 검색 장점을 상쇄하고, 하위 호환성 제약으로 성능 개선이 어려웠습니다.

  • Groonga의 개선점:

    • 자체 데이터 저장: 색인과 함께 데이터 자체를 저장합니다.
    • 컬럼 지향 스토리지: 데이터를 컬럼 값별로 저장하여 특정 컬럼의 모든 값을 빠르게 가져와 드릴다운/패싯 처리 성능을 크게 향상시킵니다.
    • 락 프리(Lock-free) 업데이트: 데이터 갱신 중에도 검색이 잠기지 않아 실시간 검색이 가능합니다.
    • 대규모 문서 지원 및 서버 모드: 대규모 문서 처리에 최적화되었으며, 독립적인 서버로 동작하여 HTTP 인터페이스를 통해 접근 가능합니다.
    • 추가 기능: 지리 정보 검색 및 웹 관리 화면을 제공합니다.

Groonga 활용법 (스키마 정의, 데이터 등록, 검색)

Groonga는 스키마 정의, 데이터 등록, 검색의 세 단계를 거쳐 사용합니다.

  • 스키마 정의: 테이블, 컬럼, 데이터 타입(정수, 문자열, 참조형 등)을 정의합니다. 루리마 서치에서는 entries 테이블에 실제 데이터를, terms 테이블에 풀텍스트 검색용 색인을 저장합니다. 스키마는 Groonga DDL 명령어나 Runga의 DSL을 통해 정의합니다.

  • 데이터 등록: entries 테이블에 데이터를 등록하면, Groonga는 자동으로 terms와 같은 색인용 테이블에 단어 단위로 분리된 색인 데이터와 해당 문서 ID를 저장하여 고속 검색을 가능하게 합니다. 이는 Groonga의 JSON 포맷이나 Runga의 entries.add 메서드를 통해 수행됩니다.

  • 검색: description 컬럼에서 특정 키워드를 검색 시, Groonga는 terms 테이블의 색인을 활용하여 해당 키워드가 포함된 문서 ID를 찾아 entries 테이블의 실제 데이터를 반환합니다. 검색은 Groonga의 select 명령어나 Runga의 entries_table.select 메서드를 통해 직관적인 Ruby 코드로 구현할 수 있습니다.

결론

본 발표는 루비 레퍼런스 매뉴얼을 위한 효율적인 검색 시스템인 '루리마 서치'의 구현 과정을 상세히 설명하며, 특히 강력한 풀텍스트 검색 엔진 'Groonga'의 활용법을 중점적으로 다루었습니다. Groonga는 Senna의 한계를 극복하고 자체 데이터 저장, 컬럼 지향 스토리지, 락 프리 업데이트 등의 혁신적인 기능을 통해 대규모 및 고성능 검색 환경을 구축하는 데 최적화된 솔루션임을 강조합니다. Groonga 1.0 및 Ruby 바인딩 Runga의 릴리스를 통해 Ruby 개발자들이 더욱 쉽고 효과적으로 풀텍스트 검색 기능을 자신들의 애플리케이션에 통합할 수 있게 되었으며, 이는 루비 생태계의 발전에 기여할 것입니다.

댓글 0

댓글 작성

0/1000
정중하고 건설적인 댓글을 작성해 주세요.

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!