@vikholodov

Как ускорить поиск Sphinx на Django?

Проблема в поиске по 3 и более словам, если 1-2 слова, то все работает мгновенно, стоит ввести больше 3х, то начинает работать postgresql и жрать 100% процессора
Использую вот этот пакет https://github.com/jorgecarleitao/django-sphinxql
Сделал indexes.py согласно инструкции:
from sphinxql import indexes, fields
from core import models

class ProductIndex(indexes.Index):
    name_rus = fields.Text(model_attr='name_rus')
    name_poland = fields.Text(model_attr='name_poland')
    category_id = fields.Text(model_attr='category_id')

    class Meta:
        model = models.Product

Вот сам код поиска, вместе с typeahead, с ним нет проблем, работает быстро, но для полноты картины не помешает. Поиск идет по 2м полям, имя товара на русском и имя товара на польском (заголовки на польском языке, но поиск осуществляется обычной латиницей с клавиатур наших с Вами соотечественников). Пробовал проверять на кириллицу, чтобы искать только по 1 полю, результата не дало...Также результат поиска будет фильтроваться по категориям, полагаю можно сузить круг поиска до самого процесса поиска и снизить нагрузку, но не могу понять как это сделать в купэ со сфинксом
def search(request):
    if request.method == 'GET':
        form = SearchForm(request.GET)
        if form.is_valid():
            name_rus = form.cleaned_data['search']
            try:
                product = Product.objects.get(Q(name_rus=name_rus)|Q(sku=name_rus))
                return redirect('product_item', product.slug)
            except:
                auto = Category.objects.filter(slug='avtotovaryi-0').get_descendants(include_self=False)
                lower = set('абвгдеёжзийклмнопрстуфхцчшщъыьэюя')
                if lower.intersection(name_rus.lower()) != set():
                    products_search = SearchQuerySet(ProductIndex).search('@name_rus '+name_rus)[0:4000]
                else:
                    products_search = SearchQuerySet(ProductIndex).search('@name_poland '+name_rus)[0:4000]    
                
                #products_search = ProductIndex.objects.search_filter(name_rus__icontains=name_rus, category_id__in=auto)[0:3000]
                #products_search = Product.objects.filter(category_id__in=auto, name_rus__icontains=name_rus)[0:3000]
                last_question = '?search=%s' % name_rus
                #categories = Category.objects.filter(categories_products__in=products_search).distinct()
                categories = Category.objects.filter(categories_products__in=products_search).distinct()

                paginator = Paginator(products_search, 40) 
                page = request.GET.get('page')
                products = paginator.get_page(page)
                return render(request, 'core/search.html', {'products':products, 'categories':categories, 'page':page, 'last_question':last_question, 'products_search':products_search})

    else: return HttpResponse('Ошибка поиска')

def typeahead(request):
    q = request.GET.get('q', '')
    prodlist = []
    objects = Product.objects.filter(Q(name_rus__icontains=q)|Q(sku=q))[0:10]
    for i in objects:
        new = {'q':i.name_rus}
        prodlist.append(new)

    return HttpResponse(json.dumps(prodlist), content_type="aplication/json")
  • Вопрос задан
  • 174 просмотра
Решения вопроса 1
opium
@opium
Просто люблю качественно работать
А при чем тут постгрес если у вас поиск через сфинкс, очень что надо просто глянуть активные запросы вс постгрес и сфинкс тут не причем
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы