使用带有 sqlalchemy 的 gin 索引返回排名搜索结果
Returning ranked search results using gin index with sqlalchemy
我为全文搜索设置了 GIN 索引。我想获得与搜索查询匹配的记录列表,按排名排序(记录与搜索查询的匹配程度)。对于结果,我只需要记录及其列,不需要用于排序的实际排名值。
我有以下查询,它运行良好并且 returns 来自我的 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 的内容,尽管我不确定 if/how 我会在解决方案中使用它。
希望在正确的方向上推动。
您可以使用 SQLAlchemy func
在查询中使用 SQL 函数
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()
我为全文搜索设置了 GIN 索引。我想获得与搜索查询匹配的记录列表,按排名排序(记录与搜索查询的匹配程度)。对于结果,我只需要记录及其列,不需要用于排序的实际排名值。
我有以下查询,它运行良好并且 returns 来自我的 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 的内容,尽管我不确定 if/how 我会在解决方案中使用它。
希望在正确的方向上推动。
您可以使用 SQLAlchemy func
在查询中使用 SQL 函数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()