如何使用tsvector字段使用postgresql全文搜索在Django中执行排名?

时间:2017-01-06 14:32:08

标签: django postgresql full-text-search

我需要使用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)不存在

1 个答案:

答案 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')