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'

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만 지원 희소 벡터 검색

This site uses Just the Docs, a documentation theme for Jekyll.