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' (или любое другое подходящее значение) в качестве первого аргумента, а затем заставить запрос соответствовать ему.