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:
parent
f8bbc6eabe
commit
34fae31fd4
2 changed files with 16 additions and 25 deletions
|
@ -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.*
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue