如何在 PostgreSQL 中使用 LOWER 创建 GIN 索引?
How to create GIN index with LOWER in PostgreSQL?
首先 - 我使用不支持 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');
然而,这个查询returns用户:
SELECT * FROM users WHERE name ILIKE '%full%';
但是这个没有:
SELECT * FROM users WHERE name LIKE '%full%';
那么,如何在PostgreSQL中创建带有LOWER的GIN索引呢?
我不确定我是否理解问题。因为你提到 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)
更新
首先 - 我使用不支持 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');
然而,这个查询returns用户:
SELECT * FROM users WHERE name ILIKE '%full%';
但是这个没有:
SELECT * FROM users WHERE name LIKE '%full%';
那么,如何在PostgreSQL中创建带有LOWER的GIN索引呢?
我不确定我是否理解问题。因为你提到 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)
更新