Django 搜索包含空格的字符串

Posted

技术标签:

【中文标题】Django 搜索包含空格的字符串【英文标题】:Django search for strings containing spaces 【发布时间】:2011-03-11 10:42:45 【问题描述】:

我有一个按姓名搜索的功能,如果搜索匹配名字或姓氏,它应该返回一个人的名字。问题是,如果我搜索像 '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】:

现在您的解析根本不会拆分查询,您可以这样做,循环遍历结果,然后自己构建一个 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()

这基本上会做的是将查询拆分,并在执行您已经在做的事情的同时循环遍历每个单词。因此,如果他们搜索“Frank Podolski”,它将检查“Frank”是否在名字、姓氏中,然后如果“Podolski”也在名字、姓氏中,而不是整个查询。

当然,您可以做更多的事情来改进搜索,例如词干提取、删除停用词等,但这超出了本问题的范围。

【讨论】:

以上是关于Django 搜索包含空格的字符串的主要内容,如果未能解决你的问题,请参考以下文章

Django查询以获取关键字集包含在搜索字符串中的所有广告

Django:如何在 Postgresql 中对日语(多字节字符串)进行全文搜索

如何在 bash 中的任意数量的空格之后搜索和替换字符串?

如何在 django 数组字段中执行全文搜索

django queryset“包含”列表,而不是字符串

在 Django 模板中错误地传递带有空格的字符串