diff --git a/apps/roam/src/utils/discourseNodeSearchProviders.ts b/apps/roam/src/utils/discourseNodeSearchProviders.ts index 8411a614c..a34d1be34 100644 --- a/apps/roam/src/utils/discourseNodeSearchProviders.ts +++ b/apps/roam/src/utils/discourseNodeSearchProviders.ts @@ -512,11 +512,12 @@ const runSupabaseSemanticSearch = async ({ } const queryEmbedding = await createEmbedding(trimmedQuery); - const { data, error } = await supabase.rpc("match_content_embeddings", { - query_embedding: JSON.stringify(queryEmbedding), - match_threshold: SUPABASE_MATCH_THRESHOLD, - match_count: SEARCH_TEST_RESULT_LIMIT, - }); + const { data, error } = await supabase + .rpc("match_content_embeddings", { + query_embedding: JSON.stringify(queryEmbedding), + match_threshold: SUPABASE_MATCH_THRESHOLD, + }) + .limit(SEARCH_TEST_RESULT_LIMIT); if (error) { throw new Error(error.message); diff --git a/apps/roam/src/utils/hyde.ts b/apps/roam/src/utils/hyde.ts index 03acdb10b..8a3a7cc5e 100644 --- a/apps/roam/src/utils/hyde.ts +++ b/apps/roam/src/utils/hyde.ts @@ -538,11 +538,12 @@ export const findSimilarNodesVectorOnly = async ({ const queryEmbedding = await createEmbedding(text); - const { data, error } = await supabase.rpc("match_content_embeddings", { - query_embedding: JSON.stringify(queryEmbedding), - match_threshold: threshold, - match_count: limit, - }); + const { data, error } = await supabase + .rpc("match_content_embeddings", { + query_embedding: JSON.stringify(queryEmbedding), + match_threshold: threshold, + }) + .limit(limit); if (error) { console.error("Vector search failed:", error); diff --git a/packages/database/src/dbTypes.ts b/packages/database/src/dbTypes.ts index 48342b32c..c37e3a030 100644 --- a/packages/database/src/dbTypes.ts +++ b/packages/database/src/dbTypes.ts @@ -1722,7 +1722,6 @@ export type Database = { match_content_embeddings: { Args: { current_document_id?: number - match_count: number match_threshold: number query_embedding: string } diff --git a/packages/database/supabase/migrations/20260622040252_optimize_match_content_embeddings.sql b/packages/database/supabase/migrations/20260622040252_optimize_match_content_embeddings.sql new file mode 100644 index 000000000..4aea9334a --- /dev/null +++ b/packages/database/supabase/migrations/20260622040252_optimize_match_content_embeddings.sql @@ -0,0 +1,32 @@ +-- Optimize match_content_embeddings by removing LIMIT from function body +-- This improves query planner performance as the LIMIT parameter was killing the planner + +set search_path to public, extensions ; + +DROP FUNCTION IF EXISTS public.match_content_embeddings(extensions.vector, double precision, integer, integer) ; + +CREATE OR REPLACE FUNCTION public.match_content_embeddings ( +query_embedding extensions.vector, +match_threshold double precision, +current_document_id integer DEFAULT NULL::integer) +RETURNS TABLE ( +content_id bigint, +roam_uid Text, +text_content Text, +similarity double precision) +SET search_path = 'extensions' +LANGUAGE sql STABLE +AS $$ +SELECT + c.id AS content_id, + c.source_local_id AS roam_uid, + c.text AS text_content, + 1 - (c.vector <=> query_embedding) AS similarity +FROM public.my_contents_with_embedding_openai_text_embedding_3_small_1536 AS c +WHERE 1 - (c.vector <=> query_embedding) > match_threshold + AND (current_document_id IS NULL OR c.document_id = current_document_id) +ORDER BY + c.vector <=> query_embedding ASC; +$$ ; + +RESET ALL ; diff --git a/packages/database/supabase/schemas/embedding.sql b/packages/database/supabase/schemas/embedding.sql index 273fd6eab..0e989e229 100644 --- a/packages/database/supabase/schemas/embedding.sql +++ b/packages/database/supabase/schemas/embedding.sql @@ -57,7 +57,6 @@ set search_path to public, extensions ; CREATE OR REPLACE FUNCTION public.match_content_embeddings ( query_embedding extensions.vector, match_threshold double precision, -match_count integer, current_document_id integer DEFAULT NULL::integer) RETURNS TABLE ( content_id bigint, @@ -76,14 +75,12 @@ FROM public.my_contents_with_embedding_openai_text_embedding_3_small_1536 AS c WHERE 1 - (c.vector <=> query_embedding) > match_threshold AND (current_document_id IS NULL OR c.document_id = current_document_id) ORDER BY - c.vector <=> query_embedding ASC -LIMIT match_count; + c.vector <=> query_embedding ASC; $$ ; ALTER FUNCTION public.match_content_embeddings ( query_embedding extensions.vector, match_threshold double precision, -match_count integer, current_document_id integer) OWNER TO "postgres" ; CREATE OR REPLACE FUNCTION public.match_embeddings_for_subset_nodes (