我们正在做一个网站搜索,我们搜索领域与icontains
。它工作得很好,但是出现的结果在顶部没有最相关的结果。订单查询结果由startswith比赛
一个例子是搜索“权力的游戏”。如果搜索“游戏”,第一个结果可能是“的......疯狂的游戏”,二是“权力的游戏”
从本质上讲,我想和icontains
进行搜索,但startswith
秩序。有任何想法吗?
我们正在做一个网站搜索,我们搜索领域与icontains
。它工作得很好,但是出现的结果在顶部没有最相关的结果。订单查询结果由startswith比赛
一个例子是搜索“权力的游戏”。如果搜索“游戏”,第一个结果可能是“的......疯狂的游戏”,二是“权力的游戏”
从本质上讲,我想和icontains
进行搜索,但startswith
秩序。有任何想法吗?
Django中添加的新功能,因为这个问题被问了,现在本地处理这个用例。
您可以通过使用Django的查询集API以下功能的任意比较顺序结果:
Q()
Object:封装一个可重用的查询表达式。我们表达对象的领域对我们的“游戏”搜索值进行比较。ExressionWrapper()
:换一个查询表达式,以便控制类型output_field
。在这种情况下,类型是布尔值。annotate()
:根据查询表达式的结果动态地将ModelField
添加到每个QuerySet对象。我们要添加True
/False
字段进行排序的。order_by()
:按指定字段对QuerySet对象进行排序。我们希望按照带注释的字段值进行排序,以便首先显示True
值。
from django.db.model import Q, ExpressionWrapper, BooleanField
....
# Your original setup.
search_term = 'Game of'
data = MyModel.objects.filter(name__icontains=search_term)
# Encapsulate the comparison expression.
expression = Q(name__startswith=search_term)
# Wrap the expression to specify the field type.
is_match = ExpressionWrapper(expression, output_field=BooleanField())
# Annotate each object with the comparison.
data = data.annotate(my_field=is_match)
# Order by the annotated field in reverse, so `True` is first (0 < 1).
data = data.order_by('-my_field')
....
你是对的!一个骇客解决方案将是一个决定分数的子查询。在订单条款中使用该分数。但这不是一个友好的解决方案。 – Willian 2012-07-24 08:25:52