以下是搜索“amadeus”子字符串时可以获得的数据示例:
db=# SELECT entidade FROM gma WHERE entidade ILIKE '%amadeus%';
entidade
---------------------------------
Hairdresser Amadeus
Snack-Bar Amadeus
Restaurant Amadeus
Restaurant Amadeus
Restaurant Amadeus
Amadeus - Musical Instruments
(6 rows)
但我希望能够ILIKE
替换LIKE
。因此,我尝试仅使用小写字母对entidade
进行索引:
db=# CREATE INDEX idx_gma_entidade ON gma USING btree
db-# ( lower(entidade) );
CREATE INDEX
到目前为止,我希望使用LIKE
访问完全相同的数据:
db=# SELECT entidade FROM gma WHERE entidade LIKE '%amadeus%';
entidade
----------
(0 rows)
但是,正如你所看到的,结果并不是我的预期...... 有人可以解释为什么吗?并且,如果可能,我如何实现预期的行为?
答案 0 :(得分:2)
您无法使用btree索引。在搜索字符串的开头使用通配符会使索引无效。
使用全文搜索或查看wildspeed。
答案 1 :(得分:2)
运行select时需要使用列上的lower()函数:
SELECT entidade FROM gma WHERE lower(entidade) LIKE '%amadeus%';
但是因为前面有一个通配符,所以查询永远不会使用索引。所以创建一个
是没有意义的答案 2 :(得分:1)
创建索引永远不应该更改查询的结果,只能更改实现的方式。您必须为文本列指定ILIKE或lower(column) LIKE '...'
等构造,以区分大小写匹配。您可以使用citext
contrib模块创建一个citext类型,默认情况下不区分大小写,这似乎是您想要的。
答案 3 :(得分:0)
每个人都指出查询未使用您的索引。您可以在查询前使用解释分析关键字来查找是否使用了索引。