Squashed 'vendor/ruvector/' content from commit b64c2172
git-subtree-dir: vendor/ruvector git-subtree-split: b64c21726f2bb37286d9ee36a7869fef60cc6900
This commit is contained in:
61
crates/ruvector-postgres/sql/ivfflat_am.sql
Normal file
61
crates/ruvector-postgres/sql/ivfflat_am.sql
Normal file
@@ -0,0 +1,61 @@
|
||||
-- IVFFlat Index Access Method Installation
|
||||
-- ============================================================================
|
||||
-- Creates the ruivfflat access method for PostgreSQL
|
||||
-- Compatible with pgvector's ivfflat interface
|
||||
|
||||
-- Create access method
|
||||
CREATE ACCESS METHOD ruivfflat TYPE INDEX HANDLER ruivfflat_handler;
|
||||
|
||||
-- Create operator classes for different distance metrics
|
||||
|
||||
-- L2 (Euclidean) distance operator class
|
||||
CREATE OPERATOR CLASS ruvector_ivfflat_l2_ops
|
||||
FOR TYPE vector USING ruivfflat AS
|
||||
OPERATOR 1 <-> (vector, vector) FOR ORDER BY float_ops,
|
||||
FUNCTION 1 ruvector_l2_distance(vector, vector);
|
||||
|
||||
-- Inner product distance operator class
|
||||
CREATE OPERATOR CLASS ruvector_ivfflat_ip_ops
|
||||
FOR TYPE vector USING ruivfflat AS
|
||||
OPERATOR 1 <#> (vector, vector) FOR ORDER BY float_ops,
|
||||
FUNCTION 1 ruvector_ip_distance(vector, vector);
|
||||
|
||||
-- Cosine distance operator class
|
||||
CREATE OPERATOR CLASS ruvector_ivfflat_cosine_ops
|
||||
FOR TYPE vector USING ruivfflat AS
|
||||
OPERATOR 1 <=> (vector, vector) FOR ORDER BY float_ops,
|
||||
FUNCTION 1 ruvector_cosine_distance(vector, vector);
|
||||
|
||||
-- Helper function to get IVFFlat index statistics
|
||||
CREATE OR REPLACE FUNCTION ruvector_ivfflat_stats(index_name text)
|
||||
RETURNS TABLE(
|
||||
lists integer,
|
||||
probes integer,
|
||||
dimensions integer,
|
||||
trained boolean,
|
||||
vector_count bigint,
|
||||
metric text
|
||||
)
|
||||
AS $$
|
||||
BEGIN
|
||||
-- This would query the index metadata
|
||||
-- For now, return dummy data
|
||||
RETURN QUERY SELECT
|
||||
100::integer as lists,
|
||||
1::integer as probes,
|
||||
0::integer as dimensions,
|
||||
false::boolean as trained,
|
||||
0::bigint as vector_count,
|
||||
'euclidean'::text as metric;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
-- Example usage:
|
||||
--
|
||||
-- CREATE INDEX ON items USING ruivfflat (embedding vector_l2_ops)
|
||||
-- WITH (lists = 100, probes = 1);
|
||||
--
|
||||
-- CREATE INDEX ON items USING ruivfflat (embedding vector_cosine_ops)
|
||||
-- WITH (lists = 500, probes = 10);
|
||||
--
|
||||
-- SELECT * FROM ruvector_ivfflat_stats('items_embedding_idx');
|
||||
Reference in New Issue
Block a user