Indexing
AkasicDB에서 벡터 검색 성능을 결정하는 핵심 단계인 인덱스 생성 과정을 안내합니다.
다양한 알고리즘(HNSW, Vamana, IVF, Flat, Sparse Inverted Index)과 주요 옵션을 요약했습니다.
1. 테이블 준비
CREATE TABLE items (
id bigserial PRIMARY KEY,
embedding vector(3) NOT NULL
);
INSERT INTO items (embedding)
SELECT ARRAY[random(), random(), random()]::real[]
FROM generate_series(1, 100000);
2. 주요 인덱스 유형
⚠️ 주의 사항
AkasicDB 커뮤니티 에디션의 경우, 벡터 인덱스의 개수와 규모에 제한이 있습니다. 벡터 인덱스의 개수는 최대 100개까지 생성할 수 있으며, 각 인덱스는 최대 1,000,000개까지의 벡터만 인덱싱할 수 있습니다.
2.1 HNSW (기본)
- 빠른 검색 속도와 우수한 리콜을 제공하는 그래프 기반 알고리즘
CREATE INDEX ON items
USING vectoron (embedding vector_l2_ops);
옵션 예시
WITH (options = $$
indexing.hnsw.m = 16
indexing.hnsw.ef_construction = 200
$$);
2.2 Vamana
- 메모리 사용량과 빌드 속도에 최적화된 그래프 알고리즘
CREATE INDEX ON items
USING vectoron (embedding vector_l2_ops)
WITH (options = $$
[indexing.vamana]
alpha = 1.2 # quality vs. speed trade-off (default: 1.2)
r = 32 # number of neighbor nodes to maintain (default: 32)
l_search = 64 # maximum search depth during query (default: 64)
phase = 1 # index build phase (default: 1)
$$);
2.3 IVF (Inverted File)
- 디스크 기반으로 대용량 처리에 강점이 있는 클러스터링 방식
CREATE INDEX ON items
USING vectoron (embedding vector_l2_ops)
WITH (options = $$
[indexing.ivf]
nlist = 1024 -- number of cluster centers
$$);
2.4 Flat (Brute‐force)
- 완전 탐색 방식으로 정확도가 최우선일 때 사용
CREATE INDEX ON items
USING vectoron (embedding vector_l2_ops)
WITH (options = $$ [indexing.flat] $$);
메모리 절감 예시
WITH (options = $$
[indexing.flat]
quantization.product.ratio = 8
$$);
2.5 Sparse Inverted Index
-
희소 벡터(
svector) 전용 인덱스. 비활성화된 차원을 건너뛰어 Dot Product 검색 속도를 극대화 -
SVECTOR 리터럴 문법: Sparse Vector는
{인덱스:값, ...}/차원수형식의 고유한 리터럴 문법을 사용- Eg)
'{1:0.1, 5:0.8}/10'
- Eg)
1) 테이블 및 데이터 준비
CREATE TABLE sparse_items (
id bigserial PRIMARY KEY,
embedding svector(10) NOT NULL
);
INSERT INTO sparse_items (embedding) VALUES
('{1:0.1}/10'::svector),
('{9:0.5}/10'::svector);
2) 인덱스 생성
CREATE INDEX ON sparse_items
USING vectoron (embedding svector_dot_ops)
WITH (options = $$
[indexing.sparse_inverted_index]
$$);
주의: Sparse Inverted Index는 오직 svector의 Dot Product만 (
<#>연산) 지원합니다.
3. 백그라운드 병합 & 일관성
- 인덱스 생성 후 비동기로 새로 삽입된 벡터를 기존 인덱스에 병합
- 검색 시 인덱스와 append-only 파일을 모두 스캔해 일관성 보장
4. 알고리즘 선택 가이드
| 알고리즘 | 장점 | 단점 | 추천 사용 사례 |
|---|---|---|---|
| HNSW | 높은 QPS, 우수한 Recall | 메모리·빌드 시간 증가 | 고정밀·고성능 검색 |
| Vamana | 빠른 빌드, 메모리·성능 균형 | 리콜이 약간 낮음 | 메모리 제약 환경에서 고속 검색 |
| IVF | 디스크 기반 대용량 처리, 빠른 클러스터링 | 리콜이 약간 낮음 | 수십억 규모 데이터, 예산 제약 환경 |
| Flat | 완전 정확, 단순 구현 | 메모리·CPU 부하 증가 | 소규모(≤1만 건)·정밀도 최우선 |
| Sparse Inverted Index | 희소 벡터 인덱스 | Dot Product만 지원 | 희소 벡터 검색 |