Django搜索排序
2024-01-10 10:48:06
Django提供了一个SearchQuery类把查询词转换为一个搜索查询对象。
使用全文搜索的实例,根据查询词出现的频率和它们之间的距离对结果进行排序。
关于全文搜索更多内容,请看Django全文搜索-CSDN博客
相关性排序
编辑views.py,添加以下导入
from django.contrib.postgres.search import SearchVector,SearchQuery,SearchRank
找到post_search
results = Post.objects.annotate(
search = SearchVector('title','body'),
).filter(search=query)
替换为
search_vector = SearchVector('title','body')
search_query = SearchQuery(query)
results = Post.objects.annotate(
search = search_vector,
rank = SearchRank(search_vector,search_query)
).filter(search=search_query).order_by('-rank')
创建一个SearchQuery对象,通过它过滤结果,并使用SearchRank按相关性对结果排序。
- SearchVector:在哪里查询
- SearchQuery:查询词是什么
- SearchRank:如何排序
权重排序
在按相关性排序结果时赋予它们更多权重。
例如,按标题而不是按内容匹配的帖子提供更多相关性。
编辑views.py
search_vector = SearchVector('title',weight='A') + SearchVector('body',weight='B')
search_query = SearchQuery(query)
results = Post.objects.annotate(
search = search_vector,
rank = SearchRank(search_vector,search_query)
).filter(rank__gte=0.3).order_by('-rank')
使用title和body字段构建的搜索向量应用了不同的权重。
默认权值为D(0.1),C(0.2),B(0.4),A(1.0)
示例对标题的搜索权重为1,对正文的权重为0.4。所以标题匹配讲优先于正文匹配。
对结果进行过滤,只显示排名高于0.3的结果。
最终查询方法代码示例
def post_search(request):
form = SearchForm()
query = None
results = []
if 'query' in request.GET:
form = SearchForm(request.GET)
if form.is_valid():
query = form.cleaned_data['query']
search_vector = SearchVector('title',weight='A') + SearchVector('body',weight='B')
search_query = SearchQuery(query)
results = Post.objects.annotate(
search = search_vector,
rank = SearchRank(search_vector,search_query)
).filter(rank__gte=0.3).order_by('-rank')
template = "blog/post/search.html"
context={
'form':form,
'query':query,
'results':results,
}
return render(request,template,context)
关于全文搜索的表单类,模版和路径的构建,请查看Django全文搜索-CSDN博客
文章来源:https://blog.csdn.net/Q1780020/article/details/135494852
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!