콘텐츠로 이동

Vector Search Basics

이 예제는 AkasicDB vector 인덱스를 만들기 전에 SQL ordering이 어떻게 동작하는지 보여줍니다. 같은 query vector로 Squared L2 distance, negative dot product, cosine distance를 비교합니다.

DROP TABLE IF EXISTS akasicdb_example_articles_minimal;

CREATE TABLE akasicdb_example_articles_minimal (
  id integer PRIMARY KEY,
  title text NOT NULL,
  embedding vector(3) NOT NULL
);

INSERT INTO akasicdb_example_articles_minimal (id, title, embedding) VALUES
  (1, 'vector indexes overview', ARRAY[1.0, 0.0, 0.0]::real[]::vector),
  (2, 'nearest neighbor search', ARRAY[0.9, 0.1, 0.0]::real[]::vector),
  (3, 'query tuning notes', ARRAY[0.7, 0.2, 0.0]::real[]::vector),
  (4, 'graph traversal basics', ARRAY[0.0, 1.0, 0.0]::real[]::vector),
  (5, 'storage operations', ARRAY[0.0, 0.0, 1.0]::real[]::vector),
  (6, 'release checklist', ARRAY[-1.0, 0.0, 0.0]::real[]::vector),
  (7, 'hybrid application notes', ARRAY[0.4, 0.4, 0.4]::real[]::vector);

SELECT id, title, embedding <-> ARRAY[1.0, 0.0, 0.0]::real[]::vector AS l2_distance
FROM akasicdb_example_articles_minimal
ORDER BY embedding <-> ARRAY[1.0, 0.0, 0.0]::real[]::vector
LIMIT 3;

SELECT id, title, embedding <#> ARRAY[1.0, 0.0, 0.0]::real[]::vector AS negative_dot
FROM akasicdb_example_articles_minimal
ORDER BY embedding <#> ARRAY[1.0, 0.0, 0.0]::real[]::vector
LIMIT 3;

SELECT id, title, embedding <=> ARRAY[1.0, 0.0, 0.0]::real[]::vector AS cosine_distance
FROM akasicdb_example_articles_minimal
ORDER BY embedding <=> ARRAY[1.0, 0.0, 0.0]::real[]::vector
LIMIT 3;

SELECT count(*) AS vector_index_count
FROM vectoron_index_stat
WHERE tablename = 'akasicdb_example_articles_minimal';

Operators

Operator 계산 기준 정렬 방향
<-> Squared L2 distance distance 오름차순
<#> Negative dot product dot product 내림차순
<=> Cosine distance distance 오름차순

마지막 query는 vectoron_index_stat을 확인합니다. 값이 0이면 이 table에는 AkasicDB vector 인덱스가 없다는 뜻입니다.