Vector Types
In the previous sections Indexing and Search, we encountered the vector
type. This section will explore additional vector types and their applications in the realm of vector search.
- Half-Precision Vector
- 8-Bit Integer Vector since v0.3.0
- Sparse Vector since v0.3.0
- Binary Vector since v0.3.0
Low-precision Indexing since v0.3.0
To improve the speed of queries on the vector
column, consider creating a low-precision index using vecf16
, veci8
, or bvector
types instead of a vector
type.
CREATE TABLE t (val vector(3));
INSERT INTO t (val) SELECT ARRAY[random(), random(), random()]::real[] FROM generate_series(1, 1000);
-- Create bvector index at vector column
-- Warning: Float32 vectors are truncated to
-- integers of either 0 or 1 during index construction
CREATE INDEX lp_bin ON t USING vectors ((binarize(val)::bvector(3)) bvector_l2_ops);
-- Create vecf16 index at vector column
CREATE INDEX lp_f16 ON t USING vectors ((val::vecf16(3)) vecf16_l2_ops);
-- Create veci8 index at vector column
-- Warning: Float32 vectors are truncated to
-- integers ranging from -128 to 127 during index construction
CREATE INDEX lp_i8 ON t USING vectors ((val::veci8(3)) veci8_l2_ops);
Shortening Embedding since v0.3.0
Certain embedding models like OpenAI text-embedding-3-small
support shortening embeddings, which involves removing some numbers from the end of the sequence without losing the embedding's concept-representing properties.
In some cases, it may be necessary to change the embedding dimension after generation. The pgvecto.rs
offers an approach to query by shortened embeddings.
CREATE TABLE t (val vector(3));
INSERT INTO t (val) SELECT ARRAY[random(), random(), random()]::real[] FROM generate_series(1, 1000);
CREATE INDEX ON t USING vectors (val vector_l2_ops);
-- Measure distance using only the first two dimensions
SELECT * from t ORDER BY (val[:2])::vector(2) <-> '[3, 2]'::vector;
Shortened embeddings are supported by all data types in pgvecto.rs
since version v0.3.0
.
Casts
This diagram shows the conversion between different data types, where the types connected by arrows can be cast to each other:
Among them, ARRAY
is a native type of postgreSQL
, others are types defined by pgvecto.rs
.
Here are some examples of vector type casting:
-- OK: String ⇒ vector
SELECT '{1,2,3}'::vector;
-- OK: vector ⇒ ARRAY
SELECT '{1,2,3}'::vector::real[];
-- OK: ARRAY ⇒ vector ⇒ bvector
SELECT ARRAY[1.0 ,0 ,0]::real[]::vector::bvector;
-- ERROR: cannot cast type vecf16 to veci8
SELECT '[3, 2]'::vecf16::veci8;
-- OK: vecf16 ⇒ vector ⇒ veci8
SELECT '[3, 2]'::vecf16::vector::veci8;