搜索每个关键字的文本字段
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})
希望这对您有所帮助:)
现在,我的 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})
希望这对您有所帮助:)