루리마 서치(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 코드로 구현할 수 있습니다.