Django поиск строк, содержащих пробелы - PullRequest
2 голосов
/ 03 июля 2010

У меня есть функция поиска по имени, которая должна возвращать имя одного человека, если поиск соответствует имени или фамилии.Проблема в том, что если я ищу строки типа 'firstname lastname', он не находит подходящего имени (думаю, это из-за пробела между словами).Что я должен сделать, чтобы поиск работал?Кроме того, если я хочу искать с тем же поиском имя пользователя (которое находится в другой таблице), как я могу это сделать?Большое спасибо!

мой код:

 def search(request):
    query = request.GET.get('q', '')
    if query:
        qset1 = (
            Q(first_name__icontains=query) |
            Q(last_name__icontains=query) 
                 )
        results = UserProfile.objects.filter(qset1).distinct()
    else:
        results = []

    return render_to_response("search/searchName.html", {

    'results': results,     
    'query': query},
    context_instance=RequestContext(request))

1 Ответ

11 голосов
/ 03 июля 2010

В данный момент ваш синтаксический анализ вообще не разбивает запрос, вы можете сделать это, просмотреть результаты и создать себе объект Q для размещения в запросе.

import operator
queries = request.GET.get('q').split()
qset1 =  reduce(operator.__or__, [Q(first_name__icontains=query) | Q(last_name__icontains=query) for query in queries])

results = UserProfile.objects.filter(qset1).distinct()

То, что это в основном будет делать, это разбивать запрос на части и циклически проходить каждое слово, выполняя в точности то, что вы уже делаете. Поэтому, если они ищут «Фрэнк Подольски», он проверит, что «Фрэнк» находится в имени, фамилии, а затем, если «Подольский» также в имени, фамилии, а не в запросе в целом.

Конечно, вы можете сделать гораздо больше, чтобы улучшить поиск, например, определение слов, удаление стоп-слов и т. Д., Но это выходит за рамки этого вопроса.

...