"""为 SearchFilter 的 title / first_author / first_author_institution 三列建 pg_trgm GIN 索引。 原因:DRF SearchFilter 走 `column ILIKE '%keyword%'` 前后通配,B-tree 索引救不了; 高频关键词 + 几十万行表会 30s+ timeout。pg_trgm 给 trigram 建 GIN 索引, ILIKE '%xxx%' 走索引,降到几十 ms。 pg_trgm 是 PostgreSQL contrib 扩展,首次启用需要 DB superuser 权限; CREATE EXTENSION IF NOT EXISTS 幂等,迁移可安全重跑。 """ from django.db import migrations class Migration(migrations.Migration): dependencies = [ ('resm', '0005_alter_paper_fetch_status'), ] operations = [ migrations.RunSQL( sql=[ "CREATE EXTENSION IF NOT EXISTS pg_trgm;", "CREATE INDEX IF NOT EXISTS paper_title_trgm " "ON resm_paper USING gin (title gin_trgm_ops);", "CREATE INDEX IF NOT EXISTS paper_first_author_trgm " "ON resm_paper USING gin (first_author gin_trgm_ops);", "CREATE INDEX IF NOT EXISTS paper_first_author_institution_trgm " "ON resm_paper USING gin (first_author_institution gin_trgm_ops);", ], reverse_sql=[ "DROP INDEX IF EXISTS paper_first_author_institution_trgm;", "DROP INDEX IF EXISTS paper_first_author_trgm;", "DROP INDEX IF EXISTS paper_title_trgm;", # pg_trgm 扩展不 drop —— 其他 app / 表可能也在用 ], ), ]