首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将2个GIN索引与gin_trgm_ops合并成一个

将2个GIN索引与gin_trgm_ops合并成一个
EN

Stack Overflow用户
提问于 2021-08-12 10:57:03
回答 1查看 465关注 0票数 3

我有一张流动的桌子

代码语言:javascript
复制
 create table mytable
(
id       serial     not null primary key,
text_id                      varchar(20)              not null,
customer_unit_id              text,
)

text_idcustomer_unit_id基本上存储类似K-2021-8524之类的代码。

在web界面中,我使用搜索窗口通过text_idcustomer_unit_id过滤掉条目。

典型的搜索会是这样的

代码语言:javascript
复制
SELECT id, text_id
FROM mytable
WHERE UPPER(text_id::text) LIKE UPPER('%2021-8%')
OR UPPER(customer_unit_id ::text) LIKE UPPER('%176%')

我创建了GIN索引,以方便搜索。

代码语言:javascript
复制
CREATE INDEX IF NOT EXISTS trgrm_test_text ON mytable
USING gin (Upper(text_id) gin_trgm_ops);

CREATE INDEX IF NOT EXISTS trgrm_test_customer ON mytable
USING gin (Upper(customer_unit_id ) gin_trgm_ops);

我尝试制作2列GIN索引,以便有一个组合索引而不是2个单独的索引--但是它不起作用(seq扫描)

问题-在这种类型的查询中,有可能有一个组合索引而不是两个单独的索引吗?

谢谢…。

PostgreSQL版本-11

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-12 13:00:14

另一种方法是创建包含两个列的内容的tsvector的第三列,然后对其进行索引,例如:

代码语言:javascript
复制
ALTER TABLE mytable ADD COLUMN ts tsvector;
UPDATE mytable SET ts =  to_tsvector('english',text_id||' '||customer_unit_id);

CREATE INDEX trgrm_ts_vec_idx2 ON mytable USING gin (ts);

你可以这样查询:

代码语言:javascript
复制
SELECT id, text_id
FROM mytable
WHERE 
 ts @@ to_tsquery('english', 'k-2021-8 | 176')

如果您负担不起额外的列,您只能在索引中使用tsvector,但是它会使查询有点混乱,而且它也应该慢一点:

代码语言:javascript
复制
CREATE INDEX IF NOT EXISTS trgrm_ts_vec_idx ON mytable 
USING gin (to_tsvector('english', text_id || ' ' || customer_unit_id));

然后像这样查询:

代码语言:javascript
复制
SELECT id, text_id
FROM mytable
WHERE 
 to_tsvector('english', text_id || ' ' || customer_unit_id) @@ 
 to_tsquery('english', 'k-2021-8 | 176');

演示:db<>fiddle

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68756120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档