1

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

4

1 回答 1

1

您的过时版本是问题所在。
这在现代 PostgreSQL 中按预期工作:

第 9.3 页的 SQL Fiddle 演示。

但不在第 8.3 页中:

第 8.3 页的 SQL Fiddle 演示。

Postgres 9.1 添加了对此的支持。每个发行说明

E.28.3.13.2。表现

Add support for `LIKE` and `ILIKE` index searches to `contrib/pg_trgm` (Alexander Korotkov)
于 2014-07-03T17:50:25.817 回答