我有一张流动的桌子
create table mytable
(
id serial not null primary key,
text_id varchar(20) not null,
customer_unit_id text,
)列text_id和customer_unit_id基本上存储类似K-2021-8524之类的代码。
在web界面中,我使用搜索窗口通过text_id或customer_unit_id过滤掉条目。
典型的搜索会是这样的
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索引,以方便搜索。
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
发布于 2021-08-12 13:00:14
另一种方法是创建包含两个列的内容的tsvector的第三列,然后对其进行索引,例如:
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);你可以这样查询:
SELECT id, text_id
FROM mytable
WHERE
ts @@ to_tsquery('english', 'k-2021-8 | 176')如果您负担不起额外的列,您只能在索引中使用tsvector,但是它会使查询有点混乱,而且它也应该慢一点:
CREATE INDEX IF NOT EXISTS trgrm_ts_vec_idx ON mytable
USING gin (to_tsvector('english', text_id || ' ' || customer_unit_id));然后像这样查询:
SELECT id, text_id
FROM mytable
WHERE
to_tsvector('english', text_id || ' ' || customer_unit_id) @@
to_tsquery('english', 'k-2021-8 | 176');演示:db<>fiddle
https://stackoverflow.com/questions/68756120
复制相似问题