1. 전문 검색 엔진 도입의 배경과 필요성
작성자는 본인의 블로그 아카이브를 단순히 보관하는 것에 그치지 않고, 과거의 자신이 특정 주제에 대해 어느 정도의 밀도로 글을 썼는지 파악하고자 하는 요구가 있었습니다. 하지만 기존에 사용하던 방식들은 다음과 같은 명확한 한계점을 가지고 있었습니다.
- SQL 기반 검색의 한계: 데이터베이스의 LIKE 연산을 통한 검색은 텍스트 양이 방대해질수록 성능이 급격히 저하되며, 복잡한 검색 쿼리를 처리하기에 부적합합니다.
- 분류 체계의 불완전성: 카테고리나 태그는 작성 시점의 주관에 따라 설정되므로 일관성이 부족하며, 태그 설정을 누락하는 경우가 많아 검색 누락이 빈번하게 발생합니다.
- 인프라 운영의 부담: 전문 검색의 대명사인 Apache Solr나 Elasticsearch는 개인 블로그가 감당하기에는 메모리 점유율과 설정 복잡도가 지나치게 높습니다.
2. Tantivy와 Tantiny의 선택 이유
이러한 제약 사항을 극복하기 위해 작성자는 Rust 언어로 구현된 차세대 전문 검색 엔진인 Tantivy를 발견했습니다. Tantivy는 C++ 수준의 성능을 제공하면서도 안전하고 현대적인 기능을 갖추고 있습니다. 특히 이를 Ruby에서 매끄럽게 사용할 수 있도록 도와주는 Tantiny 라이브러리는 다음과 같은 장점을 제공합니다.
- 설치의 간편함: 시스템에 Rust 개발 환경이 구축되어 있지 않더라도, 빌드된 바이너리가 제공된다면 Gemfile에
gem 'tantiny'를 추가하고bundle install을 실행하는 것만으로 즉시 사용이 가능합니다. - 경량 아키텍처: 별도의 서버 프로세스를 상시 가동해야 하는 대형 검색 엔진과 달리, 애플리케이션 라이브러리 형태로 통합되어 리소스 소모를 최소화합니다.
- 빠른 개발 속도: 단 몇 시간의 ‘선데이 프로그래밍’만으로도 실제 블로그 시스템에 검색 기능을 통합할 수 있을 만큼 API가 직관적입니다.
3. 시행착오와 기술적 해결 방안
초기에는 Rust와 WebAssembly(Wasm) 기반의 tinysearch를 검토했으나, 이는 일본어와 같은 비영어권 언어 처리에 치명적인 결함이 있었습니다. 일본어는 영어와 달리 띄어쓰기가 없으므로 형태소 분석(Tokenization) 과정이 필수적인데, tinysearch는 이를 제대로 지원하지 못했습니다.
반면, Tantivy는 다음과 같은 특징을 통해 문제를 해결했습니다.
- Simple Tokenizer 활용: Tantivy에서 기본으로 제공하는 Simple Tokenizer는 별도의 사전 파일(MeCab 등) 없이도 일본어 텍스트를 적절히 분리하여 검색 인덱스를 생성할 수 있는 능력을 갖추고 있습니다.
- 현실적인 정확도: 고유 명사 처리 등에서 전문적인 형태소 분석기보다는 다소 성능이 떨어질 수 있으나, 개인적인 용도의 블로그 검색에서는 충분히 만족스러운 검색 결과를 도출해냈습니다.
4. 개인 개발 생태계의 진화와 시사점
작성자는 이번 작업을 통해 개인 블로그가 기술적으로 얼마나 진보할 수 있는지 강조합니다. 현재 이 블로그는 다음과 같은 고도화된 기술 스택을 보유하게 되었습니다.
- 실시간 이미지 처리: 이미지 리사이징 서버를 직접 운영하여 클라우드 저장소(S3)의 전송 비용을 획기적으로 절감하고 있습니다.
- 자연어 처리 활용: TF-IDF 알고리즘을 적용하여 게시물 간의 연관성을 계산하고 관련 기사를 추천하는 기능을 제공합니다.
- 고성능 검색 엔진: Tantiny를 통한 전문 검색 시스템 구축으로 방대한 아카이브를 즉각적으로 탐색할 수 있는 환경을 조성했습니다.
이러한 기능들은 과거에는 대형 포털이나 전문 블로그 서비스의 전유물이었으나, 이제는 오픈 소스 생태계의 발전 덕분에 개인도 충분히 구현 가능한 영역이 되었습니다.