【问题标题】:Similarity function in Postgres with pg_trgmPostgres 中的相似函数与 pg_trgm
【发布时间】:2011-01-16 08:01:43
【问题描述】:

我正在尝试使用 Postgres 中的相似性函数来进行一些模糊文本匹配,但是每当我尝试使用它时,都会出现错误:

function similarity(character varying, unknown) does not exist

如果我向文本添加显式强制转换,我会收到错误:

function similarity(text, text) does not exist

我的查询是:

SELECT (similarity("table"."field"::text, %s::text)) AS "similarity", "table".* FROM "table" WHERE similarity > .5 ORDER BY "similarity" DESC LIMIT 10

我需要做些什么来初始化 pg_trgm 吗?

【问题讨论】:

    标签: sql postgresql fuzzy-search


    【解决方案1】:

    使用 postgresql 9.1:

    按照 tomaszbak 的回答安装(在 ubuntu 上)sudo apt-get install postgresql-contrib 之后。

    你只需要执行 sql 命令:

    CREATE EXTENSION pg_trgm;
    

    【讨论】:

    • 可能值得记住的是,根据数据库,search_path 扩展可以安装在与公共不同的架构中。
    • 注意:由于您必须是超级用户,请转到命令行并选择您的数据库 psql --username postgres --dbname database 并在那里运行命令。仅在默认数据库中不适用于您的生产应用程序
    【解决方案2】:

    你必须安装 pg_trgm。在 debian 中,获取此 sql:/usr/share/postgresql/8.4/contrib/pg_trgm.sql。从命令行:

    psql -f /usr/share/postgresql/8.4/contrib/pg_trgm.sql
    

    或者在 psql shell 中:

    \i /usr/share/postgresql/8.4/contrib/pg_trgm.sql
    

    该脚本默认安装在公共架构中,如果您想将其安装在其他地方,请编辑顶部的搜索路径(以便卸载/升级只需删除架构即可完成)。

    【讨论】:

    • 这可能是一个非常愚蠢的问题,但是如何做到这一点?
    【解决方案3】:

    在 ubuntu 上你需要运行

    sudo apt-get install postgresql-contrib
    

    获取 /usr/share/postgresql/8.4/contrib/pg_trgm.sql

    【讨论】:

    • 对于 postgres 8.4。贡献运行sudo apt-get install postgresql-contrib-8.4
    【解决方案4】:

    如果您在public 架构中安装了pg_trgm 扩展,则在使用similarity 函数时必须明确指定架构

    select schema.similarity(foo,bar) from schema.baz
    

    【讨论】:

      【解决方案5】:

      对于 Postgres 8.4,请执行以下操作:

      作为 sudo 用户运行:

      sudo apt-get install postgresql-contrib-8.4

      切换到 postgres 用户:

      sudo su - postgres

      运行:

      psql -U DB_USER -d DB_NAME -f /usr/share/postgresql/8.4/contrib/pg_trgm.sql

      重启postgres

      【讨论】:

        【解决方案6】:

        在针对使用 Django 1.11 ORM 在 Postgres 9.4 上进行三元相似性的函数运行 Django Test Runner 时,我遇到了同样的问题。

        我必须做一些事情才能让它工作:

        1) OP 是正确的,这需要启用pg_trgm 扩展。但是,在 postgres9.4 中,这是在每个数据库的基础上启用的。由于 Django 每次运行都会删除并重新创建测试数据库,因此新的测试数据库没有安装扩展。为了解决这个问题,我在 postgres 的默认新创建的数据库模板中初始化了 pg_trgm 扩展。执行此操作的命令是 psql -d template1 -c 'CREATE EXTENSION pg_trgm;'postgres 用户身份运行。

        2) Postgres 必须重新启动

        3) Django 测试运行器没有识别到​​这一点,所以我不得不从 Django 1.11.12 升级到 1.11.18(大概这在新版本的 Django 中也已修复)

        【讨论】:

          【解决方案7】:

          以防其他人也在苦苦挣扎:假设数据库被称为“ttrss”,我切换到 postgresql 的命令行:

          sudo -u postgres psql --dbname=ttrss
          

          然后在那里安装扩展:

          CREATE EXTENSION pg_trgm;
          

          【讨论】:

            猜你喜欢
            • 2017-10-07
            • 2021-05-16
            • 1970-01-01
            • 1970-01-01
            • 2021-09-10
            • 1970-01-01
            • 2020-11-30
            • 2021-11-10
            • 1970-01-01
            相关资源
            最近更新 更多