在 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”的全文搜索(并获得惊人的速度),但我无法找到所需的子字符串匹配。全文搜索只能找到整个单词是否正确?