Postgresql索引小写(列)不能按预期工作?

时间:2011-02-14 12:41:30

标签: sql postgresql

以下是搜索“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)

但是,正如你所看到的,结果并不是我的预期...... 有人可以解释为什么吗?并且,如果可能,我如何实现预期的行为?

4 个答案:

答案 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)

每个人都指出查询未使用您的索引。您可以在查询前使用解释分析关键字来查找是否使用了索引。

相关问题