mirror of
https://github.com/pgvector/pgvector.git
synced 2026-07-10 06:40:57 +08:00
Exclude zero vectors for cosine distance to be consistent with other types [skip ci]
This commit is contained in:
@@ -953,8 +953,9 @@ Function | Description | Added
|
|||||||
--- | --- | ---
|
--- | --- | ---
|
||||||
cosine_distance(intvec, intvec) → double precision | cosine distance | 0.8.0
|
cosine_distance(intvec, intvec) → double precision | cosine distance | 0.8.0
|
||||||
inner_product(intvec, intvec) → double precision | inner product | 0.8.0
|
inner_product(intvec, intvec) → double precision | inner product | 0.8.0
|
||||||
l2_distance(intvec, intvec) → double precision | Euclidean distance | 0.8.0
|
|
||||||
l1_distance(intvec, intvec) → double precision | taxicab distance | 0.8.0
|
l1_distance(intvec, intvec) → double precision | taxicab distance | 0.8.0
|
||||||
|
l2_distance(intvec, intvec) → double precision | Euclidean distance | 0.8.0
|
||||||
|
l2_norm(intvec) → double precision | Euclidean norm | 0.8.0
|
||||||
|
|
||||||
### Bit Type
|
### Bit Type
|
||||||
|
|
||||||
|
|||||||
@@ -42,6 +42,9 @@ CREATE FUNCTION cosine_distance(intvec, intvec) RETURNS float8
|
|||||||
CREATE FUNCTION l1_distance(intvec, intvec) RETURNS float8
|
CREATE FUNCTION l1_distance(intvec, intvec) RETURNS float8
|
||||||
AS 'MODULE_PATHNAME', 'intvec_l1_distance' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
|
AS 'MODULE_PATHNAME', 'intvec_l1_distance' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
|
||||||
|
|
||||||
|
CREATE FUNCTION l2_norm(intvec) RETURNS float8
|
||||||
|
AS 'MODULE_PATHNAME', 'intvec_l2_norm' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
|
||||||
|
|
||||||
CREATE FUNCTION intvec_l2_squared_distance(intvec, intvec) RETURNS float8
|
CREATE FUNCTION intvec_l2_squared_distance(intvec, intvec) RETURNS float8
|
||||||
AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
|
AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
|
||||||
|
|
||||||
@@ -96,6 +99,7 @@ CREATE OPERATOR CLASS intvec_cosine_ops
|
|||||||
FOR TYPE intvec USING hnsw AS
|
FOR TYPE intvec USING hnsw AS
|
||||||
OPERATOR 1 <=> (intvec, intvec) FOR ORDER BY float_ops,
|
OPERATOR 1 <=> (intvec, intvec) FOR ORDER BY float_ops,
|
||||||
FUNCTION 1 cosine_distance(intvec, intvec),
|
FUNCTION 1 cosine_distance(intvec, intvec),
|
||||||
|
FUNCTION 2 l2_norm(intvec),
|
||||||
FUNCTION 3 hnsw_intvec_support(internal);
|
FUNCTION 3 hnsw_intvec_support(internal);
|
||||||
|
|
||||||
CREATE OPERATOR CLASS intvec_l1_ops
|
CREATE OPERATOR CLASS intvec_l1_ops
|
||||||
|
|||||||
@@ -692,6 +692,9 @@ CREATE FUNCTION cosine_distance(intvec, intvec) RETURNS float8
|
|||||||
CREATE FUNCTION l1_distance(intvec, intvec) RETURNS float8
|
CREATE FUNCTION l1_distance(intvec, intvec) RETURNS float8
|
||||||
AS 'MODULE_PATHNAME', 'intvec_l1_distance' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
|
AS 'MODULE_PATHNAME', 'intvec_l1_distance' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
|
||||||
|
|
||||||
|
CREATE FUNCTION l2_norm(intvec) RETURNS float8
|
||||||
|
AS 'MODULE_PATHNAME', 'intvec_l2_norm' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
|
||||||
|
|
||||||
-- intvec private functions
|
-- intvec private functions
|
||||||
|
|
||||||
CREATE FUNCTION intvec_l2_squared_distance(intvec, intvec) RETURNS float8
|
CREATE FUNCTION intvec_l2_squared_distance(intvec, intvec) RETURNS float8
|
||||||
@@ -756,6 +759,7 @@ CREATE OPERATOR CLASS intvec_cosine_ops
|
|||||||
FOR TYPE intvec USING hnsw AS
|
FOR TYPE intvec USING hnsw AS
|
||||||
OPERATOR 1 <=> (intvec, intvec) FOR ORDER BY float_ops,
|
OPERATOR 1 <=> (intvec, intvec) FOR ORDER BY float_ops,
|
||||||
FUNCTION 1 cosine_distance(intvec, intvec),
|
FUNCTION 1 cosine_distance(intvec, intvec),
|
||||||
|
FUNCTION 2 l2_norm(intvec),
|
||||||
FUNCTION 3 hnsw_intvec_support(internal);
|
FUNCTION 3 hnsw_intvec_support(internal);
|
||||||
|
|
||||||
CREATE OPERATOR CLASS intvec_l1_ops
|
CREATE OPERATOR CLASS intvec_l1_ops
|
||||||
|
|||||||
@@ -159,6 +159,9 @@ HnswOptionalProcInfo(Relation index, uint16 procnum)
|
|||||||
Datum
|
Datum
|
||||||
HnswNormValue(const HnswTypeInfo * typeInfo, Oid collation, Datum value)
|
HnswNormValue(const HnswTypeInfo * typeInfo, Oid collation, Datum value)
|
||||||
{
|
{
|
||||||
|
if (!typeInfo->normalize)
|
||||||
|
return value;
|
||||||
|
|
||||||
return DirectFunctionCall1Coll(typeInfo->normalize, collation, value);
|
return DirectFunctionCall1Coll(typeInfo->normalize, collation, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -64,19 +64,18 @@ SELECT * FROM t ORDER BY val <=> '[3,3,3]';
|
|||||||
[1,1,1]
|
[1,1,1]
|
||||||
[1,2,3]
|
[1,2,3]
|
||||||
[1,2,4]
|
[1,2,4]
|
||||||
[0,0,0]
|
(3 rows)
|
||||||
(4 rows)
|
|
||||||
|
|
||||||
SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <=> '[0,0,0]') t2;
|
SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <=> '[0,0,0]') t2;
|
||||||
count
|
count
|
||||||
-------
|
-------
|
||||||
4
|
3
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <=> (SELECT NULL::intvec)) t2;
|
SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <=> (SELECT NULL::intvec)) t2;
|
||||||
count
|
count
|
||||||
-------
|
-------
|
||||||
4
|
3
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
DROP TABLE t;
|
DROP TABLE t;
|
||||||
|
|||||||
Reference in New Issue
Block a user