首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对tsvector列进行Django过滤

对tsvector列进行Django过滤
EN

Stack Overflow用户
提问于 2021-01-28 13:40:13
回答 1查看 33关注 0票数 1

我的Django应用程序有一个后端postgres数据库,它有一个tsvector列,它的值已经被计算和索引。我想使用Django的ORM对该列进行全文搜索,查询将如下所示:

代码语言:javascript
复制
SELECT [fields] FROM [table] WHERE tsvector_column @@ plainto_tsquery('TEXT HERE');

我遇到的问题是,当我使用annotateSearchVector时,Django似乎在tsvector列上重新执行to_tsvector,导致错误。

这就是我正在做的事情:

代码语言:javascript
复制
Posts.objects.annotate(search=SearchVector('THE_TS_VECTOR_COLUMN'),).filter(search='SEARCH TEXT')

在Django中如何做到这一点?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-28 23:25:52

想明白了!我使用inspectdb创建数据库模型,所以它猜测类型是一个TextField。我将其更改为SearchVectorField,如下所示:

代码语言:javascript
复制
from django.contrib.postgres.search import SearchVectorField

class CLASSNAME(models.Model):
    THE_TS_VECTOR_COLUMN = SearchVectorField(null=True)

然后我将查询更新为:

代码语言:javascript
复制
query = SearchQuery("TEXT TO SEARCH")
CLASSNAME.objects.annotate(rank=SearchVector(F('THE_TS_VECTOR_COLUMN'), query))

结果查询是这样的:

代码语言:javascript
复制
SELECT [ALL FIELD VALUES] FROM "CLASSNAME" WHERE "CLASSNAME"."THE_TS_VECTOR_COLUMN" @@ (plainto_tsquery(TEXT TO SEARCH)) = true

这正是我想要的。太棒了!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65931575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档