如何在 SQLAlchemy 查询中使用“包含”以利用 MSSQL 全文索引

问题描述 投票:0回答:2

MSSQL 有两个运算符 'contains''like',它们的行为不同:

  • Contains 仅对全文索引列执行全文搜索
  • Like不需要对该列建立索引

包含通常更快: https://www.mytecbits.com/microsoft/sql-server/like-vs-contains

我有一个使用“Like”的 SQLAlchemy 查询:

if 'FullName' in data:
    filters.append(People.FullName.like('%' + data['FullName'] + '%'))

如果我将查询更改为使用“包含”:

if 'FullName' in data:
    filters.append(People.FullName.contains(data['FullName']))

echo 返回几乎相同的东西,都使用 like,但实际上都没有使用“contains”:

FROM [People]
WHERE [People].[FullName] LIKE ? 
 ORDER BY [People].[Id] DESC
 OFFSET ? ROWS
 FETCH FIRST ? ROWS ONLY
2022-06-08 15:51:23,247 INFO sqlalchemy.engine.Engine [generated in 0.00312s] ('%Bob%', 0, 100)
FROM [People]
WHERE ([People].[FullName] LIKE '%' + ? + '%')
 ORDER BY [People].[Id] DESC
 OFFSET ? ROWS
 FETCH FIRST ? ROWS ONLY
2022-06-08 15:49:40,280 INFO sqlalchemy.engine.Engine [generated in 0.00228s] ('Bob'), 0, 100)

SQLAlchemy 文档引用 Contains,它生成一个表达式

column LIKE '%' || <other> || '%'
。 我似乎没有找到 SQLAlchemy 使用“包含”的示例。

有谁知道如何让 SQLAlchemy 使用“包含”以便我使用全文索引? 我希望查询看起来像这样:

FROM [People]
WHERE CONTAINS([People].[FullName], ?)
 ORDER BY [People].[Id] DESC
 OFFSET ? ROWS
 FETCH FIRST ? ROWS ONLY
2022-06-08 15:49:40,280 INFO sqlalchemy.engine.Engine [generated in 0.00228s] ('Bob'), 0, 100)

或者是将查询编写为 SQL 的唯一解决方案?

非常感谢:-)

python sql-server sqlalchemy azure-sql-database flask-sqlalchemy
2个回答
0
投票

所有方法

like()
contains()
startswith()
endswith()
的功能都相同。根据以下 SQLAlchemy 官方文档,上述任何方法在使用时都会使用
LIKE
运算符在内部创建一个表达式,然后对其进行求值以获得结果。

列元素和表达式 — SQLAlchemy 1.4 文档

所以,如果你的查询需要在性能方面更好,最好使用SQL查询。但是使用 SQLAlchemy 的

contains()
方法将得到与在 SQL 中使用
LIKE
运算符相同的输出。


0
投票

嘿,伙计,你找到解决方案了吗?

© www.soinside.com 2019 - 2024. All rights reserved.