如何在PostgreSQL中用LOWER创建GIN索引?

时间:2018-04-20 11:53:37

标签: sql postgresql jpa eclipselink

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

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索引?

1 个答案:

答案 0 :(得分:3)

我不确定我理解这个问题。因为你提到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