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

Try*_*yph 9 django postgresql full-text-search

我需要使用postgresql全文搜索功能和带django.contrib.postgres模块的Django执行排名查询.

根据该文档,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')
Run Code Online (Sandbox Code Playgroud)

这可能效果很好,但这并不是我想要的,因为我的表中有一个字段已经包含了我想要使用的tsvectorized数据(而不是在每个搜索查询中重新计算tsvector).

不幸的是,我无法弄清楚如何将这个tsvector字段提供给SearchRank类而不是SearchVector原始数据字段上的对象.

有人能指出如何处理这个问题吗?

编辑:当然,只是尝试SearchVector从tsvector字段实例化一个不起作用并失败并出现此错误(大约是因为我从法语翻译它):

Djang:函数to_tsvector(tsvector)不存在

Nad*_*Nad 13

如果你的模型有SearchVectorField这样的:

from django.contrib.postgres.search import SearchVectorField

class Entry(models.Model):
    ...
    search_vector = SearchVectorField()
Run Code Online (Sandbox Code Playgroud)

你会用F expression:

from django.db.models import F

...
Entry.objects.annotate(rank=SearchRank(F('search_vector'), query)).order_by('-rank')
Run Code Online (Sandbox Code Playgroud)