如何在Django中执行全文搜索?

时间:2019-12-09 14:48:12

标签: django django-views

例如,我有一个标题How to use User Model in Django,而我仅使用关键字django搜索,然后它返回所有带有django的标题,这很好,但是当我输入类似django user model的关键字时,它不返回任何值。我该怎么解决

任何帮助将不胜感激

views.py

def search_blogs(request):
    q = request.GET.get('q')
    if q:
        blogs = Blog.objects.filter(title__icontains=q).order_by('-created')
        return render(request,'blog/search_blogs.html',{"blogs":blogs,'q':q})
    else:
        messages.error(request,'Please enter some keyword to search')
        return redirect('blog:blogs')

模板

<form action="{% url 'blog:search_blog' %}" class="search-form">                
<input type="text" name="q"  placeholder="Search blogs" align="center" >
 <input type="submit" value="Search" class="btn-sm btn-info >
</form>

更新:

q = request.GET.get('q')
    if q:
        words = request.GET.get('q').split(" ")
        q_filters = Q()
        for word in words:
            q_filters |= Q(title__icontains=word)

        blogs = Blog.objects.filter(q_filters)
        return render(request, 'blog/search_blogs.html', {"blogs": blogs, 'q': words})
    else:
        messages.error(request,'Please enter some keyword to search')
        return redirect('blog:blogs')

现在更新的代码空间中也是过滤器的输入。例如,如果我搜索了user model in django,它还会返回另一个结果,该结果也有空间,但没有其他仅与 space 相匹配的标题>

2 个答案:

答案 0 :(得分:2)

一种方法是使用Q并将多个__contains组合在一起:

blogs = Blog.objects.filter(Q(title__icontains="word one") | Q(title__icontains="word two"))

您可以使用for循环来生成足够的过滤器:

words = request.GET.get('q', '').split(" ")
q_filters = Q()

for word in words:
    q_filters |= Q(title__icontains=word)

blogs = Blog.objects.filter(q_filters)

但是,如果您使用PostgreSQL作为数据库,则可以在这里看看:

Django docs: Full text search

答案 1 :(得分:0)

如果您使用Postgres,则Django为您提供全文搜索支持。参见https://docs.djangoproject.com/en/3.0/topics/db/search/

有关搜索的高级概述,请参见https://docs.djangoproject.com/en/3.0/topics/db/search/

如果您需要更强大的全文搜索,则可以使用Elasticsearch。有很多方法可以集成Django。例如django-haystack应用或Elasticsearch DSL library