FTS와 벡터 검색

개요 Class S를 만들었던 지난 하이브리드 검색 글에서는 텍스트를 토큰으로 나눠 검색하는 FTS 방식과, 임베딩 모델을 거쳐 수치로 표현해 비교하는 벡터 검색 방식을 사용했습니다. 전에는 이 두 방식을 로직 흐름으로 짧게 지나갔지만, 이번에는 더 면밀히 봐봅시다. FTS FTS는 Full Text Search입니다. LIKE '%키워드%'보다 키워드와 토큰 검색에 적합하고, 보통 tsvector, tsquery, GIN index를 조합해서 사용합니다. ※ ts: Text Search의 약어 tsvector: PostgreSQL의 데이터 타입으로, 문서를 검색 가능한 토큰 형태로 표현합니다 tsquery: PostgreSQL의 데이터 타입으로, 검색 조건을 표현합니다. plainto_tsquery(), to_tsquery() 같은 함수가 tsquery 값을 만듭니다 GIN index: tsvector의 토큰을 빠르게 찾기 위한 인덱스 구조입니다 GIN은 역인덱스(Inverted Index) 구조를 사용합니다. 일반적인 저장이 행 → 토큰이라면, 역인덱스는 이를 뒤집어 토큰 → 해당 토큰이 들어 있는 인덱스(행 위치) 목록으로 저장합니다. ...

August 12, 2026 · 10 min · DSeung001

Go 서비스에서 DB 커넥션 풀 문제 해결기

문제 상황 프로젝트 배경 지금 다루고 있는 서비스는 안과의사 PC에서 돌아가는 온프레미스 서비스입니다. 장비 들에서 찍은 데이터들을 토대로 의사들이 정확한 진료를 내릴 수 있도록 도와주는 온프레미스 의료 데이터 통합 웹 툴이죠. 이 서비스에서 장비와의 데이터 통신 부터 받은 데이터에 대한 파이프라인, 프론트 작업과 퍼블리싱 작업까지 넓게 맡고 있습니다. 해당 글에서 다룰 이슈는 다음과 같습니다. 특정 장비에서 부터 일정 양 이상의 데이터를 받으면 데이터베이스가 죽어버린다는 문제가 발생하였습니다. 장비의 데이터를 안정적으로 수신하여 의사한테 정확한 데이터를 보여줘하는 서비스 특징 상 매우 큰 이슈였습니다. ...

September 25, 2025 · 9 min · DSeung001