Python 在django中有没有一种有效的方法来执行搜索查询?
我正在创建一个博客,我想在其中根据评分(1-5)执行搜索查询。在这里,我的搜索像是查询:“智能手机技术更新”,评级:“3”。结果应该是包含查询词(至少一个词)的帖子列表,该查询词在val上以排序方式评级为3(对于每个查询词,如果在标题val+=1,如果在内容val+=0.4) My models.py文件包含以下内容:Python 在django中有没有一种有效的方法来执行搜索查询?,python,django,sqlite,search,Python,Django,Sqlite,Search,我正在创建一个博客,我想在其中根据评分(1-5)执行搜索查询。在这里,我的搜索像是查询:“智能手机技术更新”,评级:“3”。结果应该是包含查询词(至少一个词)的帖子列表,该查询词在val上以排序方式评级为3(对于每个查询词,如果在标题val+=1,如果在内容val+=0.4) My models.py文件包含以下内容: class Post(models.Model): title = models.CharField(max_length=50) content = model
class Post(models.Model):
title = models.CharField(max_length=50)
content = models.CharField(max_length=500)
rating = models.IntegerField(default=1)
enter code here
date = models.DateTimeField(default=timezone.now)
author = models.ForeignKey(User, on_delete=models.CASCADE)
My view.py文件包含以下内容:
def search(request):
contents = Post.objects.all()
if request.method == 'GET':
query = request.GET['query']
rating = request.GET['rating']
# search function
# contents = InSearch.search_fun(contents,query,rating)
vector = SearchVector('title', weight='A') + SearchVector('content', weight='B')
qry = SearchQuery(str(query))
contents = Post.objects.annotate(rank=SearchRank(vector, qry)).order_by('-rank')
#print("---->\n\t"+query+ str(contents))
context = {
'contents': contents
}
else:
context = {
'contents': Post.objects.all()
}
return render(request, 'feed/home.html', context)
我的URL.py是:
urlpatterns = [
#...
path('feed/search-result/', views.search, name='feed_search'),
]
我犯了这个错误
django.db.utils.OperationalError:没有这样的函数:plainto_tsquery
您可以在视图中这样尝试进行搜索
from django.db.models import Q
def search(request):
q = request.GET.get('q')
if q:
search_results = Post.objects.filter(Q(title__icontains=q)|Q(rating=q))
# if you want the exact then do Post.objects.filter(Q(title__iexact=q) & Q(rating=q))
return render(request, 'feed/home.html','search_results':search_results)
else:
messages.info(request,'no results found for {}',format(q))
如果要按匹配数对搜索查询结果进行排序,可以尝试以下操作:
search_results = Post.objects.filter(Q(title__icontains=q)|Q(rating=q)).annotate(title_counts=Count('title')).order_by('-title_counts')
在模板中,在搜索表单中给出name='q'
<form action="{% url 'your search action' %}">
<input type="text" name="q">
<input type='submit' value='Search'>
</form>
为什么要在sqlite中使用Postgres函数?我在Django文档中找到了这个搜索查询。正如您所说,这是postgers db函数,我使用的是sqlite。有没有办法通过django models或sqlite queryAlmost获得我想要的,但是rating
是一个整型字段,不支持icontains
。只要Q(title\u icontains=Q)| Q(rating=Q)
就行了。这不是我要问的。您的答案返回与查询完全匹配的结果。对于问题,如果我搜索“智能手机技术更新”,它将只返回具有相同顺序包含“智能手机技术更新”的帖子或标题的行。但不是有智能手机或技术或。。。而且它不会对数据进行排序,也不会返回要显式排序的附加值字段。您希望如何对数据进行排序?如果您希望得到准确的结果,则可以执行title\uu iexact=q
我希望对具有最大匹配的结果进行排序。