From 4293bc439eb37573043bf5b7b992a6f0771660d4 Mon Sep 17 00:00:00 2001 From: Andrew Kane Date: Mon, 23 Sep 2024 18:55:10 -0700 Subject: [PATCH] Exclude zero vectors for cosine distance to be consistent with other types [skip ci] --- sql/vector.sql | 1 + src/ivfutils.c | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/sql/vector.sql b/sql/vector.sql index 90441e2..d693364 100644 --- a/sql/vector.sql +++ b/sql/vector.sql @@ -912,6 +912,7 @@ CREATE OPERATOR CLASS minivec_cosine_ops FOR TYPE minivec USING ivfflat AS OPERATOR 1 <=> (minivec, minivec) FOR ORDER BY float_ops, FUNCTION 1 cosine_distance(minivec, minivec), + FUNCTION 2 l2_norm(minivec), FUNCTION 3 minivec_spherical_distance(minivec, minivec), FUNCTION 4 l2_norm(minivec), FUNCTION 5 ivfflat_minivec_support(internal); diff --git a/src/ivfutils.c b/src/ivfutils.c index 34c3f63..83da731 100644 --- a/src/ivfutils.c +++ b/src/ivfutils.c @@ -71,6 +71,9 @@ IvfflatOptionalProcInfo(Relation index, uint16 procnum) Datum IvfflatNormValue(const IvfflatTypeInfo * typeInfo, Oid collation, Datum value) { + if (!typeInfo->normalize) + return value; + return DirectFunctionCall1Coll(typeInfo->normalize, collation, value); } @@ -392,7 +395,8 @@ ivfflat_minivec_support(PG_FUNCTION_ARGS) { static const IvfflatTypeInfo typeInfo = { .maxDimensions = IVFFLAT_MAX_DIM * 4, - .normalize = minivec_l2_normalize, + /* Do not normalize to maximize precision */ + .normalize = NULL, .itemSize = MinivecItemSize, .updateCenter = MinivecUpdateCenter, .sumCenter = MinivecSumCenter