【问题标题】:searching textfield for each keyword搜索每个关键字的文本字段
【发布时间】:2015-08-14 03:27:46
【问题描述】:
现在,我的 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})
【问题讨论】:
标签:
python
django
django-views
django-queryset
【解决方案1】:
您绝对可以使用 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})
希望这会有所帮助:)
【解决方案2】:
我建议设置像Solr/Elastic Search 这样的搜索服务器。
这里只有一种情况,您需要将查询拆分为 2 个字段。也许稍后您会遇到需要在多个索引字段中查找的情况。因此,Solr 会很有帮助。
您可以阅读 Solr here。
另外,您可以利用django-haystack 让django 与Solr 进行交互,并根据用户搜索的内容获取过滤结果。