按startswithmatch排序查询结果

2024-04-25 05:24:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我们正在进行一个站点搜索,其中我们搜索一个带有icontains的字段。它的工作很好,但结果出来,没有最相关的结果在顶部。在

一个例子是搜索“权力的游戏”。如果搜索结果是“游戏”,第一个结果可能是“疯狂游戏…”,第二个结果是“权力游戏”

本质上,我想用icontains进行搜索,但是按startswith排序。有什么想法吗?在


Tags: 游戏排序站点例子权力本质startswithicontains
2条回答

Django在提出这个问题后添加了新的特性,现在以本机方式处理这个用例。在

您可以使用Django的QuerySet API中的以下功能通过任意比较来排序结果:

  1. ^{} Object:封装可重用的查询表达式。我们的表达式将对象的场与我们的“游戏的”搜索值进行比较。在
  2. ^{}:包装查询表达式,以便用output_field控制ModelField类型。在本例中,类型是布尔型。在
  3. ^{}:根据查询表达式的结果,向每个QuerySet对象动态添加一个^{}。我们想添加一个True/False字段进行排序。在
  4. {指定的对象的顺序。我们希望按带注释的字段值按相反顺序排序,以便先显示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')

    ....

你描述的排序是主观的,数据库中没有类似的数据(我知道)。如果像这样的特性很重要,那么您可能需要研究一下Solr或{a2}这样的搜索引擎,您可以在其中配置如何确定相关性得分。在

相关问题 更多 >