【问题标题】:How to create GIN index with LOWER in PostgreSQL?如何在 PostgreSQL 中使用 LOWER 创建 GIN 索引?
【发布时间】:2023-03-19 23:45:01
【问题描述】:

首先 - 我使用不支持 ILIKE 的 JPA ORM (EclipseLink)。所以我正在寻找不区分大小写搜索的解决方案。我做了以下事情:

CREATE TABLE IF NOT EXISTS users (
    id SERIAL NOT NULL,
    name VARCHAR(512) NOT NULL,
    PRIMARY KEY (id));

CREATE INDEX users_name_idx ON users USING gin (LOWER(name) gin_trgm_ops);

INSERT INTO users (name) VALUES ('User Full Name');

但是,此查询返回用户:

SELECT * FROM users WHERE name ILIKE '%full%';

但是这个没有:

SELECT * FROM users WHERE name LIKE '%full%';

那么,如何在 PostgreSQL 中使用 LOWER 创建 GIN 索引?

【问题讨论】:

    标签: sql postgresql jpa eclipselink


    【解决方案1】:

    我不确定我是否理解这个问题。因为您提到 GIN 并插入一行并期望它以不区分大小写的比较返回,但一个疯狂的猜测 - 也许您正在寻找 citext?..

    t=# create extension citext;
    CREATE EXTENSION
    t=# CREATE TABLE IF NOT EXISTS users (
        id SERIAL NOT NULL,
        name citext NOT NULL,
        PRIMARY KEY (id));
    CREATE TABLE
    t=# INSERT INTO users (name) VALUES ('User Full Name');
    INSERT 0 1
    t=# SELECT * FROM users WHERE name LIKE '%full%';
     id |      name
    ----+----------------
      1 | User Full Name
    (1 row)
    

    更新

    expression based index requires expression in query

    【讨论】:

    • 感谢您的想法。但是,我不需要解决users 表的问题,例如,我使用了users 表。在真正的数据库中,我有大约 50 个带有 varchar 的表。
    • varchar with limit?.. 不是流行的选择。为什么不发短信?.. 你可以alter table alter column type citext 这些表格
    • 是的,有限制的 varchar(64、128、256 和 512)。为什么说它不受欢迎?
    • 但是,无论如何我想得到我的问题的答案。我不喜欢某些事情不像我预期的那样工作,因为这意味着我做错了什么并且不理解某些事情。
    • 更新了答案。基本上,如果您希望索引缩短结果路径,则必须完全重复用于创建索引的表达式。如果您使用函数创建索引,即使您不在查询中使用它也不意味着 db 本身会执行该函数(如果我正确理解您的意图)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-10
    • 2015-09-02
    • 1970-01-01
    • 2023-03-28
    • 2017-10-03
    • 1970-01-01
    • 2016-09-20
    相关资源
    最近更新 更多