Vectors and index precisions
PolarDB for PostgreSQL supports multiple vector types and index precision strategies. Use this reference to select the right combination based on your storage budget, dimension count, and recall requirements.
Half-precision vectors
The halfvec type cuts storage by 50% compared to standard single-precision vectors (vector). This is useful for large embedding datasets where storage efficiency matters more than maximum precision.
CREATE TABLE items (id bigserial PRIMARY KEY, embedding halfvec(3));Binary vectors
The bit type offers the smallest storage footprint and fastest distance computations.
CREATE TABLE items_bit (id bigserial PRIMARY KEY, embedding bit(3));
INSERT INTO items_bit (embedding) VALUES ('000'), ('111');Find nearest neighbors using the Hamming distance operator (<~>):
SELECT * FROM items_bit ORDER BY embedding <~> '101' LIMIT 5;Alternatively, use the Jaccard distance operator (<%>) for set-similarity-based retrieval.
Sparse vectors
The sparsevec type stores only non-zero elements. Specify values in the {index1:value1,index2:value2}/dimension format. Indexes start at 1, consistent with SQL arrays.
CREATE TABLE items_spa (id bigserial PRIMARY KEY, embedding sparsevec(5));
INSERT INTO items_spa (embedding) VALUES ('{1:1,3:2,5:3}/5'), ('{1:4,3:5,5:6}/5');Find nearest neighbors using the L2 distance operator (<->):
SELECT * FROM items_spa ORDER BY embedding <-> '{1:3,3:1,5:2}/5' LIMIT 5;Half-precision indexing
Index a standard vector column at half precision to produce a smaller HNSW index. Cast to halfvec in both the index definition and the query.
CREATE INDEX ON items USING hnsw ((embedding::halfvec(3)) halfvec_l2_ops);Query using the same cast:
SELECT * FROM items ORDER BY embedding::halfvec(3) <-> '[1,2,3]' LIMIT 5;Binary quantization
Build the binary quantization index using expression indexing:
CREATE INDEX ON items USING hnsw ((binary_quantize(embedding)::bit(3)) bit_hamming_ops);Retrieve the top candidates by Hamming distance:
SELECT * FROM items
ORDER BY binary_quantize(embedding)::bit(3) <~> binary_quantize('[1,-2,3]'::halfvec)
LIMIT 5;Re-rank using the original vectors to improve recall. The inner query retrieves 20 candidates; the outer query re-scores by cosine distance (<=>) and returns the top 5:
SELECT * FROM (
SELECT * FROM items
ORDER BY binary_quantize(embedding)::bit(3) <~> binary_quantize('[1,-2,3]'::halfvec)
LIMIT 20
) AS foo
ORDER BY embedding <=> '[1,-2,3]'
LIMIT 5;