搜索每个关键字的文本字段

searching textfield for each keyword

现在,我的 views.py 函数允许我在每个 Django 文本字段中搜索整个搜索短语。但是,如果我想搜索标题和作者,例如 "biology John",我的查询集将最终为空,而且我不确定如何拆分短语并搜索单个词。

def search(request):
    query = request.GET.get('search')
    if query:
        results = Protocol.objects.filter(Q(title__contains=query) | Q(author__contains=query) | Q(description__contains=query) | Q(reagents__contains=query) | Q(protocol_steps__contains=query))
    else:
        results = ''
    return render(request, 'protocat_app/search_protocols.html',{'results':results})

我建议设置像 Solr/Elastic Search 这样的搜索服务器。 这里只有一种情况需要将查询拆分为 2 个字段。也许稍后您会遇到需要在多个索引字段中查找的情况。因此,Solr 会很有帮助。

您可以阅读 Solr here

此外,您可以利用 django-haystack 使 django 与 Solr 交互并根据用户搜索的内容获取过滤结果。

你绝对可以用 solr/elasticsearch 设置 haystack。但是如果你还需要一些数据库查询,你可以使用下面的:

import operator

def search(request):
    terms = request.GET.get('search', '').split(' ')
    q_list = []
    for term in terms:
        if term:
            q_list.append(Q(title__contains=query))
            q_list.append(Q(author__contains=query))
            q_list.append(Q(description__contains=query))
            q_list.append(Q(reagents__contains=query))
            q_list.append(Q(protocol_steps__contains=query))

    if q_list:
        results = Protocol.objects.filter(reduce(operator.or_, q_list))
    else:
        results = ''
    return render(request, 'protocat_app/search_protocols.html',{'results':results})

希望这对您有所帮助:)