在PostgreSQL 8.3中(对不起过时的版本 - 我无法改变)我有一个这样的表:
CREATE TABLE tablephonebook
(
id bigserial NOT NULL,
name1 text,
name2 text,
number text,
...
CONSTRAINT tablephonebook_pkey PRIMARY KEY (id)
)
桌子有大约50 000条记录。
我已成功创建了GIST索引:
CREATE INDEX trgm_idx ON tablephonebook USING gist (name1 gist_trgm_ops, name2 gist_trgm_ops);
使用LIKE(或ILIKE)运算符进行文本搜索需要太长时间,并且不使用GIST索引:
EXPLAIN ANALYZE SELECT id, name1, name2
WHERE name1 ILIKE '%south%'
OR name2 ILIKE '%south%'
FROM tablephonebook
ORDER BY id
LIMIT 1000;
Limit (cost=0.00..10737.05 rows=903 width=80) (actual time=333.125..333.125 rows=0 loops=1)
-> Seq Scan on tablephonebook (cost=0.00..10737.05 rows=903 width=80) (actual time=333.123..333.123 rows=0 loops=1)"
Filter: ((name1 ~~* '%south%'::text) OR (name2 ~~* '%south%'::text))
Total runtime: 333.155 ms
我做错了什么?我读过LIKE / ILIKE使用这个单词索引。
作为一种替代方法,我尝试使用带有“to_tsquery”的全文搜索(并获得华丽的速度),但我无法找到子串匹配,这是一项要求。全文搜索只能找到整个单词吗?
答案 0 :(得分:1)
你过时的版本就是问题 这与现代PostgreSQL预期的一样:
但不是在第8.3页:
Postgres 9.1增加了对此的支持。 Per release notes:
E.28.3.13.2。性能
Add support for `LIKE` and `ILIKE` index searches to `contrib/pg_trgm` (Alexander Korotkov)