Проблема в поиске по 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")