Django全文搜索顺序相关

时间:2010-08-20 09:37:31

标签: django django-queryset

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

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

如何根据相关性对其进行排序,因为目前它似乎按字母顺序排序?

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

修改

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

class Meta:
    ordering = ['title']

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

5 个答案:

答案 0 :(得分:3)

注意到here时,搜索结果为Boolean

没有这样的相关性系数用于订购。

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

除此之外:我将继续推荐卡尔对干草堆的推荐,特别是因为它允许更复杂的事情,如词干(“舞蹈”将匹配“舞蹈”,“舞者”和“舞蹈”),刻面(“显示用户&每个搜索结果的点击次数“),获得与您当前正在显示的对象类似的对象等。当我上次尝试飞快移动时,它不稳定(即在索引期间崩溃)但是花了相当短的时间是时候点燃索尔了,这很棒。

答案 4 :(得分:0)

如果使用Django> = 1.2

,可以使用带有ORDER BY子句的原始搜索来实现此目的。
File.objects.raw(query_string, params[x,y,z])

虽然raw_querset目前在不支持count()方面有其自身的缺点。

然而,它会带回模型,因此非常容易使用,但不像__search

那么简单