python - 使用带有 sqlalchemy 的 gin 索引返回排名搜索结果

标签 python postgresql sqlalchemy full-text-search rdbms

我为全文搜索设置了 GIN 索引。我想获得与搜索查询匹配的记录列表,按排名排序(记录与搜索查询的匹配程度)。对于结果,我只需要记录及其列,不需要用于排序的实际排名值。

我有以下查询,它运行良好并从我的 postgresql 数据库返回预期结果。

SELECT *, ts_rank('{0.1,0.1,0.1,0.1}', users.textsearchable_index_col, to_tsquery('smit:* | ji:*')) AS rank
FROM users
WHERE users.authentication_method != 2 AND users.textsearchable_index_col @@ to_tsquery('smith:* | ji:*') ORDER 
BY rank desc;

我想使用 sqlalchemy(SA) 执行此查询。我了解“ts_rank”尚未准备好在 SA 中使用。我已经尝试了很多东西,比如

proxy = self.db_session.query(User, text(
                """ts_rank('{0.1,0.1,0.1,0.1}', users.textsearchable_index_col, to_tsquery(:search_str1)) as rank""")). \
                filter(User.authentication_method != 2,
                       text("""users.textsearchable_index_col @@ to_tsquery(:search_str2)""")). \
                params(search_str1=search, search_str2=search). \
                order_by("rank")

还阅读了有关使用 column property 的信息,尽管我不确定是否/如何在解决方案中使用它。

希望在正确的方向上轻推。

最佳答案

您可以使用 SQLAlchemy 在查询中使用 SQL 函数 func

from sqlalchemy.sql.expression import func

(db.session.query(User, func.ts_rank('{0.1,0.1,0.1,0.1}', User.textsearchable_index_col, func.to_tsquery('smit:* | ji:*')).label('rank'))
    .filter(User.authentication_method != 2)
    .filter(User.textsearchable_index_col.op('@@')(func.to_tsquery('smit:* | ji:*')))
    .order_by('rank desc')
).all()

关于python - 使用带有 sqlalchemy 的 gin 索引返回排名搜索结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33025891/

相关文章:

python-3.x - 如何通过 pandas `df.to_sql()` 在已创建的数据库表中插入值

python - Django + SQLAlchemy + RESTful API(美味?)

python - 在Django中通过smtp发送邮件

python - 从列表中写入数据

python - 如何设置 Selenium 以使用多个 Firefox 配置文件?

sql - 如何从子查询中引用函数结果列?

ruby-on-rails - 一个接一个地保存和提交新记录,而不是在 block 的末尾

postgresql - X 列不存在。 (按功能创建列)

python - 如何将 association_proxy 和 ordering_list 与 SQLAlchemy 一起正确使用

python - 将输入列表中的字典元素附加到元组列表