【问题标题】:Sqlalchemy full text search with multiple columns and partial search in postgresqlSqlalchemy 多列全文搜索和 postgresql 中的部分搜索
【发布时间】:2018-04-24 00:05:25
【问题描述】:

我对此进行了很多搜索,但我还没有找到最好的解决方案。假设我们有下表:

Class User(DeclarativeBase):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    first_name = Column(String)
    last_name = Column(String)
    description = Column(String)

与用户:

  • 安迪 |约翰逊 |哈哈哈哈哈哈

  • 安德雷斯 |布什 |呸呸呸

搜索应包括first_namelast_namedescription 列。

我想搜索ohns 查询,在我的结果中,我想以某种方式知道匹配的列是什么,并且以某种方式结果是完全匹配还是部分匹配?

我尝试了单个 ts_vector 与 3 个提到的列,但我无法提取有关搜索结果的更多详细信息。我应该以某种方式将全文与 pg_trgm 函数结合起来吗?

【问题讨论】:

    标签: python postgresql sqlalchemy full-text-search


    【解决方案1】:

    我认为您可以使用三元组相似性来获取有关匹配类型和所涉及列的确切信息。

    我做了一个简单的SQL示例作为演示:

    SELECT "first_name", "last_name", "description",
           CASE
               WHEN SIMILARITY("first_name", 'ohns') >= 1.0 THEN 'exact'
               WHEN SIMILARITY("first_name", 'ohns') > 0.0 THEN 'partial'
               ELSE 'no'
           END AS "first_name_match",
           CASE
               WHEN SIMILARITY("last_name", 'ohns') >= 1.0 THEN 'exact'
               WHEN SIMILARITY("last_name", 'ohns') > 0.0 THEN 'partial'
               ELSE 'no'
           END AS "last_name_match",
           CASE
               WHEN SIMILARITY("description", 'ohns') >= 1.0 THEN 'exact'
               WHEN SIMILARITY("description", 'ohns') > 0.0 THEN 'partial'
               ELSE 'no'
           END AS "description_match"
    FROM (VALUES
         ('Andy', 'Johnson', 'blah blah blah'),
         ('Andress', 'Bush', 'blah blah'),
         ('Ohns', 'Johnson', 'blah')
    ) AS I("first_name", "last_name", "description")
    WHERE (SIMILARITY("first_name", 'ohns') + SIMILARITY("last_name", 'ohns') + SIMILARITY("description", 'ohns')) > 0.0
    
     first_name | last_name |  description   | first_name_match | last_name_match | description_match 
    ------------+-----------+----------------+------------------+-----------------+-------------------
     Andy       | Johnson   | blah blah blah | no               | partial         | no
     Ohns       | Johnson   | blah           | exact            | partial         | no
    

    您可以在此处查看正在运行的 SQL:

    http://sqlfiddle.com/#!17/9eecb/6356

    【讨论】:

    • 这与专门针对 SQLAlchemy 解决方案而不是纯 SQL 解决方案的问题无关。
    • 你是对的,但我没有机会在 sqlalchemy 中对其进行测试,但我试图以其他方式帮助@memlucky。看来我的解决方案帮助他接受了它,所以我可以接受。
    猜你喜欢
    • 2012-11-01
    • 2018-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多