1

......这是我应该做的事情吗?

根据我的简短测试,制作三元组索引并使用搜索

where name like '%query%'

where name ilike '%query%'

所以看起来我应该这样做,但我很惊讶我无法找出如何去做。

(我的测试数据相当同质 - 150 万行由 16 个重复的条目组成。我可以想象这可能会影响结果。)

这就是我期望它的工作方式(注意lower(name)):

create extension pg_trgm;

create table users(name text);

insert into users values('Barry');

create index "idx" on users using gin (lower(name) gin_trgm_ops);

select count(*) from users where (name like '%bar%');

但这会返回0

任何一个

select count(*) from users where (name like '%Bar%');

或者

select count(*) from users where (name ilike '%bar%');

工作,这让我相信索引中的三元组不是lower()'d。我是否误解了这在引擎盖下是如何工作的?那里不能打电话lower吗?

我注意到这

select show_trgm('Barry')

返回小写三元组:

{"  b"," ba",arr,bar,rry,"ry "}

所以我很困惑。

4

1 回答 1

2

三元组肯定是小写的。

当您考虑如何使用 trigram 索引时,难题就变得清晰了:它们充当过滤器,消除了大多数不匹配,但允许误报结果(其中一个原因是它们不区分大小写)。这就是为什么总是必须进行重新检查以消除这些误报的原因,这就是为什么您总是会进行位图索引扫描的原因。

查询可能会更慢,ILIKE因为它有更多的结果,或者因为不区分大小写的比较需要更多的努力。

于 2020-10-07T06:39:59.387 回答