Задать вопрос

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

Интернет магазин с 6 млн позиций, будет в районе 10 млн, уже испытываю огромные проблемы с производительностью поиска. Прямое вхождение еще как-то работает, если это можно назвать работой (13 секунд с нажатия кнопки поиска до загрузки страницы), поиск похожих соответствий вообще не работает, обваливается с ошибкой 502
Попробовал поставить elasticsearch, но не могу проиндексировать товары, у меня 4гб оперативы на сервере, при индексации сервер убивает процесс из-за нехватки памяти (команда manage.py search_index --rebuild). Как быть? =(
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__iexact=name_rus)|Q(sku=name_rus))
                return redirect('product_item', product.slug)
            except:
                products_search = Product.objects.annotate(search=SearchVector('name_rus', 'name_poland')).filter(search=name_rus)

                last_question = '?search=%s' % name_rus
                categories = Category.objects.filter(categories_products__in=products_search).distinct()
                paginator = Paginator(products_search, 40)  # Show 25 contacts per page
                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})

    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")
  • Вопрос задан
  • 1313 просмотров
Подписаться 7 Простой 5 комментариев
Решения вопроса 1
Taraflex
@Taraflex
Ищу работу. Контакты в профиле.
при индексации сервер убивает процесс из-за нехватки памяти

Попробуйте
sphinxsearch.com
Должен быть гораздо более щадящ к ресурсам
Неплохие уроки chakrygin.ru/search/label/Sphinx
Пакет для django
https://github.com/jorgecarleitao/django-sphinxql
Ответ написан
Пригласить эксперта
Ответы на вопрос 6
@asd111
13 секунд для прямого вхождения как то слишком долго.
Мне кажется что у вас падает из за архитектуры БД.
Посмотрите htop во время индексации — скорее всего всю память сжирает SQL из за тяжелых запросов, а не elastic-sphinx.
Попробуйте перекинуть все товары в mongodb и сделать таким образом денормализованную базу товаров.
Ответ написан
dimonchik2013
@dimonchik2013
non progredi est regredi
спешил фо ю
https://habrahabr.ru/post/346884/

на предсмет не смотри, на замеры смотри
Ответ написан
Комментировать
Astrohas
@Astrohas
Python/Django Developer
Ну хорошо, но самый хороший вариант - апгрейд сервера. Да, можно поставить Sphinx, и он возможно будет меньше потреблять ресурсов, но не надолго. Поэтому лучше попросите не жлобствовать денег на оперативу.
Ну можете из стандартных способов использовать увеличение swap файла, ну и ZRAM подключите.
Ответ написан
Комментировать
@EazyE
А индексы посоздавали для поисковых полей?
Ответ написан
zenwalker
@zenwalker
0xABADBABE
1. В комментарии к одному из ответов вы упомянули, что используете db_index=True, но для полнотестового поиска вам нужен специальный индекс. Покурите вот этот раздел документации постгреса: https://www.postgresql.org/docs/9.5/static/textsea...

2. Избавьтесь от запроса name_rus__iexact=name_rus, ваш SearchVector это покрывает.
Ответ написан
Комментировать
@vikholodov Автор вопроса
В общем, я думал что я решил вопрос, но не тут тот было. Сфинкс отлично справляется с поиском по 1-2 словам, но стоит ввести более конкретный запрос из 4-5 слов, тот все...уходит думать на 15 секунд, загрузка процессора на 100% и падение сервера. С прямым вхождением проблем вообще нет, все мгновенно.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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