본문 바로가기
SingleStoreDB/엔지니어링

SingleStore로 구현한 실시간 자동완성과 오타 허용

by 에이플랫폼 [Team SingleStore Korea] 2025. 3. 14.

안녕하세요, 에이플랫폼입니다.

오늘은 최신 HTAP(하이브리드 트랜잭션/분석 처리) 데이터베이스인 SingleStore를 활용하여 Java Lucene 기반 Full Text Search 기능을 이용한 실시간 오타 허용 자동 완성 시스템 구축 방법을 소개해 드리겠습니다.

SingleStore는 HTAP 데이터베이스로서 트랜잭션과 분석 작업을 단일 시스템에서 처리할 수 있어, 사용자의 입력을 검색 결과에 실시간으로 반영할 수 있습니다. 이를 활용하면 빠르고 정확한 자동 완성 기능을 구축할 수 있습니다.


 

실시간 자동 완성 시스템을 위한 핵심 요소

  1. 오타 허용
    • 맞춤법 오류가 포함된 검색어에도 적절한 제안을 제공해야 합니다.
  2. 실시간 성능
    • 대규모 데이터 세트에서도 최소한의 지연 시간으로 빠르게 검색 결과를 반환해야 합니다.

 

효율적인 검색을 위한 핵심 기술

SingleStore의 강력한 Full Text Search 기능을 활용하여 자동 완성 시스템의 성능을 최적화할 수 있습니다. 주요 기술은 다음과 같습니다.

1. N-gram 검색

  • 빠른 접두사 기반 검색을 위해 텍스트를 N-gram 단위로 분할하여 인덱싱합니다.

2. Fuzzy 검색

  • 맞춤법 오류가 포함된 검색어에도 유사한 단어를 찾아 적절한 추천을 제공합니다.

3. BM25 기반 순위 지정

  • 검색 결과의 관련성을 평가하여 가장 적절한 제안을 우선적으로 노출합니다.

Python 애플리케이션과의 연동

위에서 설명한 기능을 Python 애플리케이션에 통합하여 실시간 자동 완성 기능을 구현하는 방법도 함께 소개해 드리겠습니다. SingleStore의 강력한 SQL 기능과 Full Text Search를 활용하면 복잡한 로직 없이도 손쉽게 자동 완성 시스템을 구축할 수 있습니다.


Full-text Indexing, Version 2

SingleStore는 2018년부터 전체 텍스트 검색을 지원해왔으며, 버전 2에서는 강력한 오픈 소스 검색 라이브러리인 JLucene이 크게 개선되었습니다.

JLucene은 Java 기반이지만, SingleStore는 이를 SQL과 통합하여 Java에 대한 깊은 전문 지식 없이도 쉽게 사용할 수 있도록 합니다.

자동 완성 시스템을 구축하기 위해 다음과 같은 주요 기능을 활용할 것입니다.

Java Lucene의 특징

  • 기존 C-Lucene 기반 버전 1은 TF-IDF 알고리즘을 사용했으나, 버전 2에서는 Java Lucene을 기반으로 BM25 알고리즘을 사용합니다. BM25는 TF-IDF를 개선한 보다 정교한 검색 알고리즘입니다.
  • Full Text Search Version 2 관련 쿼리를 처음 실행할 때, 전용 프로세스가 생성됩니다.
  • 한 세션에서 여러 개의 FTS2 쿼리를 동시에 수행하거나, 여러 세션에서 쿼리를 실행하더라도 하나의 Java 프로세스에서 처리됩니다.

BM25 알고리즘의 특징

  • 문서 길이 정규화를 통해 문서의 길이를 고려하여 점수를 조정합니다.
  • 일반적으로 자주 등장하는 단어보다 드문 단어에 높은 점수를 부여합니다.
  • 점수에 상한이 없으며, 값이 높을수록 검색 정확도가 높음을 의미합니다.

SingleStore의 Korean(Nori) Analyzer (8.9.5 업데이트)

SingleStore 8.9.3부터 내장형 Korean Analyzer를 지원하기 시작했으며, 8.9.5부터 Custom Korean Filter 및 Tokenizer 기능을 제공합니다.

이 기능은 Nori 한글 형태소 분석기를 기반으로 하며, 기존 CJK(중국어, 일본어, 한국어 통합 분석기)와는 별도로 동작하는 전용 Analyzer입니다.


빠른 접두사 일치를 위한 N-gram 검색

N-gram 인덱스는 텍스트를 겹치는 문자 시퀀스(n-gram)로 자동 분해하여 저장하는 방식입니다.

이러한 전처리를 통해 검색어를 n-gram 단위로 나누고,

인덱스에 저장된 토큰과 비교하여 빠르게 접두사 검색을 수행할 수 있습니다.

이를 통해 조회 시간을 크게 단축할 수 있습니다.

 

예를 들어, tri-gram(3-gram) 기반의 전체 텍스트 인덱스를 사용할 경우, “apple"이라는 단어는 다음과 같이 나뉩니다.

app, ppl, ple
 

맞춤법 오류를 보완하는 Fuzzy 검색

Fuzzy 검색은 편집 거리(예: ~1)를 지정하여 철자 오류가 있는 검색어도 유사한 단어로 검색할 수 있도록 하는 기능입니다.

더보기

편집 거리란

두 문자열 간의 차이를 수치화한 값으로, 한 문자열을 다른 문자열로 변환하는 데 필요한 최소한의 편집 연산(삽입, 삭제, 대체, 전치) 횟수를 의미합니다.

SingleStore에서는 MATCH 절에 Fuzzy 연산자를 추가하면, Damerau-Levenshtein 거리를 기반으로 지정된 편집 거리 내에서 유사한 단어를 찾아 검색할 수 있습니다.

이를 통해 철자 오류나 입력 실수가 있어도 원하는 검색 결과를 얻을 수 있습니다.

SELECT term
FROM search_terms
WHERE MATCH(TABLE search_terms) AGAINST('term:autocmte~1' OPTIONS 
'{"fuzzy_prefix_length":2}')
LIMIT 5;
 

용어 우선순위를 위한 BM25 점수

BM25는 검색 결과의 관련성을 평가하는 알고리즘으로, 용어의 빈도와 희귀도를 기반으로 순위를 매깁니다.

이를 통해 가장 관련성이 높은 용어를 우선적으로 고려합니다.

각 문서는 용어의 출현 빈도, 문서 길이, 그리고 해당 용어가 전체 문서에서 얼마나 드물게 등장하는지를 반영한 점수를 통해 평가됩니다.

SingleStore는 검색 결과마다 BM25 점수를 계산하여, 자주 등장하면서도 중요한 용어일수록 높은 순위를 가지도록 합니다.

SELECT term, BM25_GLOBAL(search_terms) AS score  
FROM search_terms  
WHERE MATCH(TABLE search_terms) AGAINST('term:autoc*' IN BOOLEAN MODE)
ORDER BY score DESC
LIMIT 10;

오타를 허용하는 실시간 자동 완성 구축

이제 SingleStore에서 오타를 허용하는 실시간 자동 완성 시스템을 실제로 구현하는 방법을 알아보겠습니다.

먼저 데이터베이스 스키마를 정의한 후, BM25 Scoring을 활용하여 접두사 및 유사 항목과 일치하는 쿼리 패턴을 설계합니다. 마지막으로, 이러한 쿼리를 간단한 Flask 애플리케이션에 통합하는 방법을 소개합니다.

 

1. 데이터베이스 스키마 (N-gram + Fuzzy 검색에 최적화)

부분 입력오타를 효율적으로 처리하기 위해 products 테이블을 만들고 n-gram 토크나이저FULLTEXT INDEX (버전 2)를 구성합니다. 이 인덱스는 단어를 겹치는 시퀀스로 나누어 빠른 접두사 검색을 수행할 수 있습니다.

CREATE TABLE products (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255),
    FULLTEXT USING VERSION 2 (name)
        INDEX_OPTIONS '{
            "analyzer": {
                "custom": {
                    "tokenizer": {
                        "n_gram": {
                            "minGramSize": 2,
                            "maxGramSize": 5
                        }
                    },
                    "token_filters": ["lower_case"]
                }
            }
        }'
);
 

샘플 데이터 삽입

INSERT INTO products (name) VALUES
('iphone'),
('ipod'),
('ipad'),
('samsung'),
('nokia'),
('motorola'),
('pixel'),
('blackberry'),
('htc');

OPTIMIZE TABLE products FLUSH;
 

이렇게 하면 새로 삽입된 데이터가 전체 텍스트 인덱스에 의해 선택됩니다.

 

2. 쿼리 및 쿼리 패턴

자동 완성 알고리즘은 최상의 제안을 반환하기 위해 2단계 쿼리 전략을 따릅니다.

 

1단계: 접두사(N-gram) 검색

이 쿼리는 사용자의 입력에 따라 부분 일치를 빠르게 검색합니다.

SELECT name, BM25(products, 'name:ip') AS score
FROM products
WHERE BM25(products, 'name:ip') > 0
ORDER BY score DESC
LIMIT 10;
 

2단계: 유사 항목 검색(오타에 대한 대체)

제안이 5개 미만 이고 사용자 입력이 4자 이상인 경우 유사 항목 일치를 수행합니다.

아래와 같이 하면 "ipod" 대신 "ipdo"와 같은 오타를 처리하는 데 도움이 됩니다.

SELECT name, BM25(products, 'name:"ipod"~1') AS score
FROM products
WHERE BM25(products, 'name:"ipod"~1') > 0
ORDER BY score DESC
LIMIT 10;
 

 


데모 영상은 잘 보셨나요?

제가 원본 데모 파일을 열심히 수정하고 데모 영상도 직접 편집했습니다. 힘들었어요 ㅜㅜ

흥미롭게 보셨다면 에이플랫폼 카페로 오셔서 SingleStore에 대해 더 알아보세요.

카페에는 블로그에는 없는 다양한 이벤트와 흥미로운 글들도 많이있습니다.

 

SingleStore를 활용한 실시간 자동완성과 오타 교정 기능은 현대 검색 시스템의 새로운 가능성을 열어줍니다.

특히 높은 확장성한글 FULL TEXT SEARCH 지원이라는 강점은 한국어 기반 서비스에도 최적화된 솔루션을 제공합니다.

  • 확장성: 사용자 수가 급격히 증가하더라도 운영 중 다운타임 없이 노드를 추가하거나 제거할 수 있어, 안정적인 서비스 제공이 가능합니다.
  • 한글 지원: 한국어 토크나이저를 포함한 FULL TEXT SEARCH 기능으로, 한글 데이터 처리와 검색 정확도를 극대화합니다.

이 외에도 SingleStore는 실시간 데이터 분석, 낮은 레이턴시, 그리고 OLTP와 OLAP를 동시에 처리하는 HTAP 아키텍처를 통해 데이터 중심 애플리케이션의 성능을 극대화합니다.

이를 통해 검색 시스템뿐만 아니라 다양한 데이터 집약적 애플리케이션에서 활용될 수 있습니다.

SingleStore의 이러한 강점들은 단순히 기술적 우위를 넘어 사용자 경험을 혁신적으로 향상시키는 데 기여할 것입니다. 앞으로도 SingleStore를 활용한 다양한 응용 사례가 등장하며, 데이터베이스 기술의 새로운 기준을 제시할 것으로 기대됩니다.

감사합니다.