diff --git a/server/src/queries/search.repository.sql b/server/src/queries/search.repository.sql index cd9a84b016..7de61ad03c 100644 --- a/server/src/queries/search.repository.sql +++ b/server/src/queries/search.repository.sql @@ -279,13 +279,7 @@ LIMIT -- SearchRepository.searchSmart START TRANSACTION SET - LOCAL vectors.enable_prefilter = on; - -SET - LOCAL vectors.search_mode = vbase; - -SET - LOCAL vectors.hnsw_ef_search = 100; + LOCAL vectors.hnsw_ef_search = 200; SELECT "asset"."id" AS "asset_id", "asset"."deviceAssetId" AS "asset_deviceAssetId", @@ -369,7 +363,7 @@ WHERE ORDER BY "search"."embedding" <= > $6 ASC LIMIT - 101 + 201 COMMIT -- SearchRepository.searchDuplicates @@ -404,12 +398,6 @@ WHERE -- SearchRepository.searchFaces START TRANSACTION -SET - LOCAL vectors.enable_prefilter = on; - -SET - LOCAL vectors.search_mode = vbase; - SET LOCAL vectors.hnsw_ef_search = 100; WITH @@ -436,7 +424,7 @@ WITH ORDER BY "search"."embedding" <= > $1 ASC LIMIT - 100 + 64 ) SELECT res.* diff --git a/server/src/repositories/search.repository.ts b/server/src/repositories/search.repository.ts index 01b7773076..ba7d779e02 100644 --- a/server/src/repositories/search.repository.ts +++ b/server/src/repositories/search.repository.ts @@ -111,7 +111,7 @@ export class SearchRepository implements ISearchRepository { @GenerateSql({ params: [ - { page: 1, size: 100 }, + { page: 1, size: 200 }, { takenAfter: DummyValue.DATE, embedding: Array.from({ length: 512 }, Math.random), @@ -137,7 +137,10 @@ export class SearchRepository implements ISearchRepository { .orderBy('search.embedding <=> :embedding') .setParameters({ userIds, embedding: asVector(embedding) }); - await manager.query(this.getRuntimeConfig(pagination.size)); + const runtimeConfig = this.getRuntimeConfig(pagination.size); + if (runtimeConfig) { + await manager.query(runtimeConfig); + } results = await paginatedBuilder(builder, { mode: PaginationMode.LIMIT_OFFSET, skip: (pagination.page - 1) * pagination.size, @@ -196,7 +199,7 @@ export class SearchRepository implements ISearchRepository { { userIds: [DummyValue.UUID], embedding: Array.from({ length: 512 }, Math.random), - numResults: 100, + numResults: 10, maxDistance: 0.6, }, ], @@ -236,7 +239,10 @@ export class SearchRepository implements ISearchRepository { cte.addSelect(`faces.${col}`, col); } - await manager.query(this.getRuntimeConfig(numResults)); + const runtimeConfig = this.getRuntimeConfig(numResults); + if (runtimeConfig) { + await manager.query(runtimeConfig); + } results = await manager .createQueryBuilder() .select('res.*') @@ -421,17 +427,14 @@ export class SearchRepository implements ISearchRepository { return results.map(({ model }) => model).filter((item) => item !== ''); } - private getRuntimeConfig(numResults?: number): string { + private getRuntimeConfig(numResults?: number): string | undefined { if (this.vectorExtension === DatabaseExtension.VECTOR) { return 'SET LOCAL hnsw.ef_search = 1000;'; // mitigate post-filter recall } - let runtimeConfig = 'SET LOCAL vectors.enable_prefilter=on; SET LOCAL vectors.search_mode=vbase;'; - if (numResults) { - runtimeConfig += ` SET LOCAL vectors.hnsw_ef_search = ${numResults};`; + if (numResults && numResults !== 100) { + return `SET LOCAL vectors.hnsw_ef_search = ${Math.max(numResults, 100)};`; } - - return runtimeConfig; } }