我的Django应用程序有一个后端postgres数据库,它有一个tsvector列,它的值已经被计算和索引。我想使用Django的ORM对该列进行全文搜索,查询将如下所示:
SELECT [fields] FROM [table] WHERE tsvector_column @@ plainto_tsquery('TEXT HERE');我遇到的问题是,当我使用annotate和SearchVector时,Django似乎在tsvector列上重新执行to_tsvector,导致错误。
这就是我正在做的事情:
Posts.objects.annotate(search=SearchVector('THE_TS_VECTOR_COLUMN'),).filter(search='SEARCH TEXT')在Django中如何做到这一点?
谢谢!
发布于 2021-01-28 23:25:52
想明白了!我使用inspectdb创建数据库模型,所以它猜测类型是一个TextField。我将其更改为SearchVectorField,如下所示:
from django.contrib.postgres.search import SearchVectorField
class CLASSNAME(models.Model):
THE_TS_VECTOR_COLUMN = SearchVectorField(null=True)然后我将查询更新为:
query = SearchQuery("TEXT TO SEARCH")
CLASSNAME.objects.annotate(rank=SearchVector(F('THE_TS_VECTOR_COLUMN'), query))结果查询是这样的:
SELECT [ALL FIELD VALUES] FROM "CLASSNAME" WHERE "CLASSNAME"."THE_TS_VECTOR_COLUMN" @@ (plainto_tsquery(TEXT TO SEARCH)) = true这正是我想要的。太棒了!
https://stackoverflow.com/questions/65931575
复制相似问题