1
0
Fork 0
mirror of https://github.com/immich-app/immich.git synced 2024-12-28 06:31:58 +00:00

fix(server): remove unnecessary guc settings for vector search (#14237)

remove unnecessary guc settings
This commit is contained in:
Mert 2024-11-19 16:37:39 -05:00 committed by GitHub
parent f8bbc6eabe
commit 34fae31fd4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 16 additions and 25 deletions

View file

@ -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.*

View file

@ -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<AssetEntity>(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;
}
}