Как искать по нескольким таблицам с помощью полнотекстового поиска Postgres и индекса GIN в Django

models.py

from django.contrib.postgres.indexes import GinIndex
from django.db import models
from django.contrib.postgres.search import SearchVectorField


class FilmTag(models.Model):
    name = models.CharField(max_length=255)


class Film(models.Model):
    film_id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=255)
    description = models.TextField(blank=True, null=True)
    tags = models.ManyToManyField(FilmTag, null=True, blank=True)

    vector_column = SearchVectorField(null=True)  # new field

    def __str__(self):
        return ', '.join(['film_id=' + str(self.film_id), 'title=' + self.title, 'description=' + self.description])

    class Meta:
        indexes = (GinIndex(fields=["vector_column"]),)  # add index

0002_миграция

# Generated by Django 5.0.4 on 2024-04-03 19:41

from django.db import migrations


class Migration(migrations.Migration):
    dependencies = [
        ("app", "0002_film_vector_column_film_app_film_vector__2213d6_gin"),
    ]

    operations = [
        migrations.RunSQL(
            sql='''
              CREATE TRIGGER vector_column_trigger
              BEFORE INSERT OR UPDATE OF title, description, vector_column
              ON app_film
              FOR EACH ROW EXECUTE PROCEDURE
              tsvector_update_trigger(
                vector_column, 'pg_catalog.english', title, description
              );

              UPDATE app_film SET vector_column = NULL;
            ''',

            reverse_sql='''
              DROP TRIGGER IF EXISTS vector_column_trigger
              ON film;
            '''
        ),
    ]

Я хотел бы также искать по тегам, используя Postgres Full Text Search, так что если я введу "комедия", он выдаст соответствующие фильмы. Как я могу реализовать это? В настоящее время поиск ограничивается текстом и описанием фильма. Буду признателен, если вы дадите ссылки на соответствующие ресурсы или учебники. Спасибо

Вернуться на верх