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 давно, но он все еще поддерживается!)

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