콘텐츠로 이동

Other Vector Indexes

이 페이지는 Vamana 외 vector 인덱스의 생성 문법과 주요 옵션을 다룹니다.

HNSW

HNSW는 그래프 기반 ANN 인덱스입니다. 아래 예제는 L2 distance용 vector_l2_ops를 사용합니다.

CREATE INDEX items_embedding_hnsw_idx
  ON items
  USING vectoron (embedding vector_l2_ops)
  WITH (options = $$
    [indexing.hnsw]
    m = 12
    ef_construction = 300
  $$);
Option Default 설명
indexing.hnsw.m 12 노드마다 유지하는 graph edge 수의 상한입니다. 값이 클수록 index memory 사용량과 build time이 증가합니다.
indexing.hnsw.ef_construction 300 인덱스 구축 중 후보 탐색 폭입니다. 값이 클수록 build time이 길어지고 graph 연결 구조가 달라집니다.

IVF

IVF는 벡터를 cluster로 나누고 query time에 일부 cluster를 탐색하는 ANN 인덱스입니다. nlist는 build-time option이고, 검색할 cluster 수는 vectoron.ivf_nprobe로 조정합니다.

CREATE INDEX items_embedding_ivf_idx
  ON items
  USING vectoron (embedding vector_l2_ops)
  WITH (options = $$
    [indexing.ivf]
    nlist = 1000
  $$);
Option Default 설명
indexing.ivf.nlist 1000 IVF가 생성하는 cluster 수입니다. 값이 클수록 cluster당 평균 후보 수는 줄고 build time과 index metadata 비용은 증가합니다.

Flat

Flat은 small dataset이나 ANN validation에서 exact baseline으로 사용합니다. 데이터가 커질수록 CPU 비용이 직접 증가합니다.

CREATE INDEX items_embedding_flat_idx
  ON items
  USING vectoron (embedding vector_l2_ops)
  WITH (options = $$
    [indexing.flat]
  $$);

Sparse Inverted Index

Sparse Inverted Index는 svector 컬럼의 dot-product ordering에 사용하는 인덱스입니다. 예제는 svector_dot_ops<#>를 사용합니다.

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);

CREATE INDEX sparse_items_embedding_idx
  ON sparse_items
  USING vectoron (embedding svector_dot_ops)
  WITH (options = $$
    [indexing.sparse_inverted_index]
  $$);

인덱스 요약

Index 용도 주요 조정값
HNSW L2, dot product, cosine distance를 사용하는 dense vector workload indexing.hnsw.m, indexing.hnsw.ef_construction, vectoron.hnsw_ef_search
IVF build-time cluster 수와 query-time scan 범위를 분리해서 조정하는 workload indexing.ivf.nlist, vectoron.ivf_nprobe
Flat 작은 데이터셋, exact baseline, ANN 결과 검증 없음
Sparse Inverted Index svector 컬럼에 <#> Ordering을 사용하는 workload 없음