Postgres GinIndex не улучшает производительность

Я пытаюсь улучшить время поискового запроса, используя postgres ginindex. но это ничего не дает, и время запроса одинаково с индексом и без него. Это первый раз, когда я использую индекс, и я не уверен, что я делаю неправильно.

models.py

class Book(models.Model):
    author = models.ManyToManyField(Author, related_name='books')
    category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True)
    title = models.CharField(max_length=1000)
    description = models.TextField(max_length=3000)
    price = models.DecimalField(max_digits=6, decimal_places=2)
    publisher = models.CharField(max_length=1000)
    language = models.CharField(max_length=200)
    pages = models.PositiveSmallIntegerField()
    isbn = models.CharField(max_length=13, validators=[MaxLengthValidator(13)])
    cover_image = models.ImageField(upload_to='books/images', null=True)
    publish = models.BooleanField(default=True)
    favorite = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='favorite_books', blank=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    objects = BookManager()

    def __str__(self):
        return self.title

    class Meta:
        indexes = [
            GinIndex(fields=['title'], name='book_title_idx')
        ]

views.py

    def get_queryset(self):
        query = self.request.query_params.get("search", None)

        if query:
            
            books = Book.objects.annotate(
                search=SearchVector("title", "author__name"),
            ).filter(search=query)
            
            print(books.explain(analyze=True))

            return books
        else:
            return self.queryset

Я также добавил BtreeGinExtension в файл миграции

Ваш индекс не соответствует вашему запросу. Чтобы поддержать этот запрос, индекс должен быть на выражении:

to_tsvector(COALESCE("books_book"."title", '') || ' ' || COALESCE("books_author"."name", ''))

Но это не сработает, поскольку to_tsvector с одним аргументом не является неизменным - он зависит от настройки default_text_search_config. Поэтому вместо этого вам нужно предоставить 'english' (или любое другое подходящее значение) в качестве первого аргумента, а затем заставить запрос соответствовать ему.

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