我正在使用Django查询过滤器__search来执行全文搜索,例如
MyModel.objects.filter(title__search = 'some title')
如何根据相关性对其进行排序,因为目前它似乎按字母顺序排序?
具体来说,我希望在标题为some title
的内容之前首先显示标题为a different but contains some title
的搜索结果。
修改
我注意到,在MyModel的模型定义中,我有:
class Meta:
ordering = ['title']
如果我删除它,则排序变得正确,即按相关性排序。那么有没有一种方法可以将其留在模型定义中,因为它在其他地方很有用,但是在我的查询中告诉它忽略它?
答案 0 :(得分:3)
答案 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 那么简单