mirror of
https://github.com/immich-app/immich.git
synced 2026-05-18 03:10:24 +03:00
fix(server): use substring matching for person name search (#26903)
This commit is contained in:
@@ -200,13 +200,10 @@ select
|
|||||||
from
|
from
|
||||||
"person"
|
"person"
|
||||||
where
|
where
|
||||||
(
|
"person"."ownerId" = $1
|
||||||
"person"."ownerId" = $1
|
and f_unaccent ("person"."name") %>> f_unaccent ($2)
|
||||||
and (
|
order by
|
||||||
lower("person"."name") like $2
|
f_unaccent ("person"."name") <->>> f_unaccent ($3)
|
||||||
or lower("person"."name") like $3
|
|
||||||
)
|
|
||||||
)
|
|
||||||
limit
|
limit
|
||||||
$4
|
$4
|
||||||
|
|
||||||
|
|||||||
@@ -312,16 +312,10 @@ export class PersonRepository {
|
|||||||
return this.db
|
return this.db
|
||||||
.selectFrom('person')
|
.selectFrom('person')
|
||||||
.selectAll('person')
|
.selectAll('person')
|
||||||
.where((eb) =>
|
.where('person.ownerId', '=', userId)
|
||||||
eb.and([
|
.where(() => sql`f_unaccent("person"."name") %>> f_unaccent(${personName})`)
|
||||||
eb('person.ownerId', '=', userId),
|
.orderBy(sql`f_unaccent("person"."name") <->>> f_unaccent(${personName})`)
|
||||||
eb.or([
|
.limit(100)
|
||||||
eb(eb.fn('lower', ['person.name']), 'like', `${personName.toLowerCase()}%`),
|
|
||||||
eb(eb.fn('lower', ['person.name']), 'like', `% ${personName.toLowerCase()}%`),
|
|
||||||
]),
|
|
||||||
]),
|
|
||||||
)
|
|
||||||
.limit(1000)
|
|
||||||
.$if(!withHidden, (qb) => qb.where('person.isHidden', '=', false))
|
.$if(!withHidden, (qb) => qb.where('person.isHidden', '=', false))
|
||||||
.execute();
|
.execute();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
import { Kysely, sql } from 'kysely';
|
||||||
|
|
||||||
|
export async function up(db: Kysely<any>): Promise<void> {
|
||||||
|
await sql`CREATE INDEX "idx_person_name_trigram" ON "person" USING gin (f_unaccent("name") gin_trgm_ops);`.execute(db);
|
||||||
|
await sql`INSERT INTO "migration_overrides" ("name", "value") VALUES ('index_idx_person_name_trigram', '{"type":"index","name":"idx_person_name_trigram","sql":"CREATE INDEX \\"idx_person_name_trigram\\" ON \\"person\\" USING gin (f_unaccent(\\"name\\") gin_trgm_ops);"}'::jsonb);`.execute(db);
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function down(db: Kysely<any>): Promise<void> {
|
||||||
|
await sql`DROP INDEX "idx_person_name_trigram";`.execute(db);
|
||||||
|
await sql`DELETE FROM "migration_overrides" WHERE "name" = 'index_idx_person_name_trigram';`.execute(db);
|
||||||
|
}
|
||||||
@@ -5,6 +5,7 @@ import {
|
|||||||
CreateDateColumn,
|
CreateDateColumn,
|
||||||
ForeignKeyColumn,
|
ForeignKeyColumn,
|
||||||
Generated,
|
Generated,
|
||||||
|
Index,
|
||||||
PrimaryGeneratedColumn,
|
PrimaryGeneratedColumn,
|
||||||
Table,
|
Table,
|
||||||
Timestamp,
|
Timestamp,
|
||||||
@@ -16,6 +17,11 @@ import { AssetFaceTable } from 'src/schema/tables/asset-face.table';
|
|||||||
import { UserTable } from 'src/schema/tables/user.table';
|
import { UserTable } from 'src/schema/tables/user.table';
|
||||||
|
|
||||||
@Table('person')
|
@Table('person')
|
||||||
|
@Index({
|
||||||
|
name: 'idx_person_name_trigram',
|
||||||
|
using: 'gin',
|
||||||
|
expression: 'f_unaccent("name") gin_trgm_ops',
|
||||||
|
})
|
||||||
@UpdatedAtTrigger('person_updatedAt')
|
@UpdatedAtTrigger('person_updatedAt')
|
||||||
@AfterDeleteTrigger({
|
@AfterDeleteTrigger({
|
||||||
scope: 'statement',
|
scope: 'statement',
|
||||||
|
|||||||
Reference in New Issue
Block a user