sqlalchemy中的Trigram距离运算

时间:2018-10-24 10:50:36

标签: python postgresql sqlalchemy fuzzy-search trigram

我当前正在尝试使用pg_trgm操作%<->。 列上的GIN索引已经可用,但是我找不到与前面提到的运算符等效的sqlalchemy。

除了编写纯文本查询之外,什么是解决此问题的最佳方法。

一个简单的示例查询将是:

tag = test
tag_subq = session.query(sticker_tag.file_id, f'sticker_tag.name <-> {tag}'.label(distance)) \
    .filter(f'sticker_tag.name % {tag}')) \
    .filter('distance' < 0.3) \
    .subquery("tag_subq")

上面的查询显然不起作用,并且select和filter字符串只是占位符,以可视化我打算做什么。

2 个答案:

答案 0 :(得分:3)

您可以使用Operators.op()方法;这将生成您需要的任何运算符:

sticker_tag.name.op('<->')(tag)
sticker_tag.name.op('%')(tag)

答案 1 :(得分:0)

对于使用 Postgres 的人,可以使用 similarity 来代替。

注意:请记住先在 Postgres 中安装 pg_trgm 扩展:CREATE EXTENSION pg_trgm;

这是使用 SQLAlchemy 的示例:

# ... other imports
from sqlalchemy import and_, func, or_

def search_store_product(search_string: str) -> Optional[list[Product]]:
    try:
        return session.query(Product).filter(
            or_(
                func.similarity(Product.name, search_string) > 0.6,
                func.similarity(Product.brand, search_string) > 0.4,
            ),
            and_(Product.updated_on >= datetime.utcnow() - timedelta(days=5)),
        ).order_by(Product.created_on).limit(20).all()

    except ProgrammingError as exception:
        logger.exception(exception)
        raise

    finally:
        session.close()