【问题标题】:Django full text search order by relevanceDjango全文搜索顺序按相关性
【发布时间】:2011-04-01 13:51:33
【问题描述】:

我正在使用 Django 查询过滤器 __search 来执行全文搜索,例如

MyModel.objects.filter(title__search = 'some title')

我如何让它按相关性排序,因为目前它似乎是按字母顺序排序的?

具体来说,我希望标题为 some title 的搜索结果首先出现在标题为 a different but contains some title 的内容之前。

编辑:

我注意到在 MyModel 的模型定义中我有:

class Meta:
    ordering = ['title']

如果我删除它,那么排序就会正确,即按相关性排序。那么有没有一种方法可以将它留在模型定义中,因为它在其他地方有用,然后在我的查询中告诉它忽略它?

【问题讨论】:

  • 我不相信它真的如你所愿。只是按照自然顺序,正如所指出的,这是一个布尔搜索。
  • 我会回应 Enrico 的评论:鉴于您接受的答案,如果您删除标题排序,您似乎仍然误解您的结果实际上是按相关性排序的。情况并非如此:与 order by 无关,您可以按照数据库选择给您的任何顺序来获取它们。

标签: django django-queryset


【解决方案1】:

如果使用 Django >= 1.2,您可以通过使用带有 ORDER BY 子句的原始搜索来实现此目的

File.objects.raw(query_string, params[x,y,z])

虽然 raw_querset 目前有其自身的缺点,例如不支持 count()。

但它确实带回了模型,因此非常易于使用,尽管不像 __search 那样简单

【讨论】:

    【解决方案2】:

    尝试:Model.objects.all().order_by().search() - 调用order_by without any parameters does no ordering at all

    除此之外:我将支持 Carl 对 Haystack 的推荐,特别是因为它允许更复杂的事情,例如词干(“dance”将匹配“dances”、“dancers”和“dancing”)、刻面(“显示用户& 每个搜索结果的点击次数”),获取与您当前显示的对象相似的对象等。当我上次尝试 Whoosh 时,它不稳定(即在索引期间崩溃)但花了相当短的时间启动 Solr,这很棒。

    【讨论】:

    • 我最近在 Whoosh 上运气不错。但它并没有做所有花哨的事情:词干是的,刻面的不是:(
    • 我应该注意到我的 Whoosh 体验很短暂,大约一年前。从那以后我听说它已经稳定了,但实际上并不需要它,因为我们已经出于各种原因需要 Solr(分面、支持多种语言)。
    【解决方案3】:

    在 Django 项目中获得良好全文搜索的最简单方法是使用出色的 Haystack 应用程序。设置起来非常简单,尤其是如果您使用最简单的搜索引擎后端(Whoosh,它是纯 Python)。您可以在几分钟内设置内容的全文索引,以及相关排序的结果和许多其他不错的功能。如果您超出了 Whoosh 的性能/并发性/功能限制,因为您使用 Haystack 来抽象搜索功能,您可以随时将 Solr 替换为 Whoosh。

    【讨论】:

      【解决方案4】:

      对于按相关性排序的搜索结果,内置布尔搜索会多一些。这里有两种方法(Sphinxsearch 和 Whoosh):

      【讨论】:

        【解决方案5】:

        注意到here,搜索是Boolean

        没有这样的相关性系数可用于排序。

        一个愚蠢的想法可以按标题长度排序,这是有道理的。

        【讨论】:

          猜你喜欢
          • 2011-11-05
          • 2012-03-02
          • 2012-11-09
          • 2011-08-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-09
          相关资源
          最近更新 更多