有没有人知道如何在sqlalchemy中使用postgresql的to_tsquery()函数?我在谷歌搜索了很多,我找不到任何我能理解的东西。请帮忙。
我希望它在过滤器功能中可用,如下所示:
session.query(TableName).filter(Table.column_name.to_tsquery(search_string)).all()
上述查询的预期SQL是这样的:
Select column_name
from table_name t
where t.column_name @@ to_tsquery(:search_string)
答案 0 :(得分:8)
对于这些类型的任意查询,您可以将sql直接嵌入到查询中:
session.query(TableName).\
filter("t.column_name @@ to_tsquery(:search_string)").\
params(search_string=search_string).all()
您还应该能够参数化t.column_name
,但目前无法查看相关文档。
答案 1 :(得分:6)
.op()方法允许您为任意运算符生成SQL。
session.query(TableName).filter(
Table.c.column_name.op('@@')(to_tsquery(search_string))
).all()
答案 2 :(得分:0)
这可能是最近添加的,但值得作为更标准的解决方案添加。
query.filter(Model.attribute.match('your search string'))
为您做这件事,因为它会寻找适用于您方言的正确操作。
请参阅官方文档: https://docs.sqlalchemy.org/en/13/dialects/postgresql.html#full-text-search
当然,这假定您要查询的表是使用to_tsvector
属性构建的视图,该视图将对其应用@@
操作。
答案 3 :(得分:0)
我 2021 年的五十美分,following the docs
之前的答案都没有提到如何将文本列转换为 postgres: to_tsvector('english', column)。我有一个索引为 tsvector 的文本列。这就是方法:
select(mytable.c.id).where(
func.to_tsvector('english', mytable.c.title )\
.match('somestring', postgresql_regconfig='english')
)
就我而言,我不想将 to_tsquery
用作“.match”力。更直观的方法是在您有像 stackOverflow 这样的搜索输入时使用 websearch_to_tsquery
。所以我做了一个来自jd response的混音。
我最终将其应用为 .filter()
以下语句:
func.to_tsvector('english', Table.column_name)\
.op('@@')(func.websearch_to_tsquery("string to search",
postgresql_regconfig='english'))
我认为这是通用公式,它也适用于 to_tsquery
。