4

我们正在做一个站点搜索,我们在其中搜索一个带有icontains. 它工作得很好,但出现的结果在顶部没有最相关的结果。

一个例子是搜索“权力的游戏”。如果搜索是“Game of”,第一个结果可能是“Crazy Game of...”,第二个结果可能是“Game of Thrones”

本质上,我想用 搜索icontains,但按startswith. 有任何想法吗?

4

2 回答 2

5

自从提出这个问题以来,Django 添加了新功能,现在本地处理这个用例。

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

  1. Q()Object:封装了一个可重用的查询表达式。我们的表达式将对象的字段与我们的“ Game of ”搜索值进行比较。
  2. ExressionWrapper(): 包装一个查询表达式,以便ModelFieldoutput_field. 在这种情况下,类型是布尔值。
  3. annotate()ModelField:根据查询表达式的结果,动态地向每个 QuerySet 对象添加一个。我们想添加一个True/False字段进行排序。
  4. 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')

    ....
于 2018-01-23T20:06:12.113 回答
3

您描述的顺序是主观的,并且数据库中没有类似的数据(我知道)。如果这样的功能很重要,您可能需要查看像SolrSphinx这样的搜索引擎,您可以在其中配置如何确定相关性分数。

于 2012-07-24T01:03:19.940 回答