From 85ff91a11bdabaa38ea771cc1e42e267c92ef3dc Mon Sep 17 00:00:00 2001 From: John Costa Date: Tue, 13 May 2025 17:03:05 +0100 Subject: [PATCH] feat: get similar images function --- backend/models/image.go | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/backend/models/image.go b/backend/models/image.go index dc04dbf..0f502a2 100644 --- a/backend/models/image.go +++ b/backend/models/image.go @@ -196,6 +196,44 @@ func (m ImageModel) UpdateEmbedding(ctx context.Context, imageId uuid.UUID, embe return err } +const SIMILARITY_THRESHOLD = 0.9 + +func (m ImageModel) GetSimilar(ctx context.Context, imageId uuid.UUID) ([]model.Image, error) { + stmt, err := m.dbPool.PrepareContext(ctx, ` + WITH similarities AS ( + SELECT 1 - (embedding <=> ( + SELECT embedding + FROM haystack.image + WHERE ID = $1 + )) AS cosine_similarity, id, image_name FROM haystack.image + WHERE embedding IS NOT NULL + ) + SELECT id, image_name + FROM similatiries + WHERE cosine_similarity > $2 + `) + + if err != nil { + return []model.Image{}, err + } + + images := []model.Image{} + + rows, err := stmt.QueryContext(ctx, imageId, SIMILARITY_THRESHOLD) + + for rows.Next() { + image := model.Image{} + err := rows.Scan(&image) + if err != nil { + return []model.Image{}, err + } + + images = append(images, image) + } + + return images, nil +} + func NewImageModel(db *sql.DB) ImageModel { return ImageModel{dbPool: db} }