Django Полнотекстовый поиск работает очень медленно, как сделать его быстрым?
У меня есть обширная база данных продуктов, и я хочу реализовать функциональность полнотекстового поиска, чтобы пользователи могли легко находить продукты. Для этой цели я использовал SearchVector с Postgres, однако его производительность довольно низкая. Несмотря на попытки увеличить скорость за счет индексирования, это не дало желаемых результатов. Ниже приведен фрагмент кода, с которым я работал.
models.py
class Product(models.Model):
brand = models.ForeignKey(BrandName,related_name="brand_products", on_delete=models.CASCADE,db_index = True)
item_name_title = models.CharField(max_length=10000, db_index = True,)
product_description = models.TextField(db_index = True,)
class Meta:
indexes = [
GinIndex(fields=['search_vector']),
]
Views.py
search = request.GET.get('search')
search_vector = SearchVector(
'product__mob_sku',
'product__item_name_title',
'product__product_description',
'product__brand__brand_name',
)
query = SearchQuery(search)
vendor_products = VendorProducts.objects.annotate(
rank = (SearchRank(search_vector , query))
).filter(rank__gte=0.001).select_related(
'vendor', 'product').prefetch_related(
'product__product_images', 'product__brand').exclude(
vendor__vendor_name = "ALL_123").order_by('-rank')
Ваши индексы не используются, поскольку ваш поиск охватывает несколько моделей. Вам действительно нужно собрать все эти связанные поля в большой поисковый индекс.
Если вы хотите использовать стороннее приложение Django, django-watson
поддерживает следующее:
https://github.com/etianen/django-watson/wiki/registering-models#searching-across-related-models
(я написал django-watson
давно, но он все еще поддерживается!)