我需要使用postgresql全文搜索功能和带有django.contrib.postgres
模块的Django执行排名查询。
根据the doc,通过执行以下操作,使用SearchRank
类很容易做到这一点:
>>> from django.contrib.postgres.search import SearchQuery, SearchRank, SearchVector
>>> vector = SearchVector('body_text')
>>> query = SearchQuery('cheese')
>>> Entry.objects.annotate(rank=SearchRank(vector, query)).order_by('-rank')
这可能效果不错,但这并不是我想要的,因为我的表中有一个字段,其中包含我想使用的tsvectorized数据(而不是在每个搜索查询中重新计算tsvector )。
不幸的是,我无法弄清楚如何将此tsvector字段提供给SearchRank
类,而不是原始数据字段上的SearchVector
对象。< / p>
有人能指出如何处理这个问题吗?
修改:
当然,简单地尝试从tsvector字段中实例化SearchVector
不起作用并且因此错误而失败(大约是因为我从法语翻译它):
django.db.utils.ProgrammingError:错误:函数to_tsvector(tsvector)不存在
答案 0 :(得分:11)
如果您的模型有SearchVectorField
,请执行以下操作:
from django.contrib.postgres.search import SearchVectorField
class Entry(models.Model):
...
search_vector = SearchVectorField()
您将使用F expression
:
from django.db.models import F
...
Entry.objects.annotate(rank=SearchRank(F('search_vector'), query)).order_by('-rank')