Postgresql索引小写(列)无法按预期工作?

Postgresql索引小写(列)无法按预期工作?,sql,postgresql,Sql,Postgresql,以下是搜索amadeus子字符串时可以获得的数据示例: db=# SELECT entidade FROM gma WHERE entidade ILIKE '%amadeus%'; entidade --------------------------------- Hairdresser Amadeus Snack-Bar Amadeus Restaurant Amadeus Restaurant Amadeus Restaurant Amadeus Am

以下是搜索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)
但是我想用喜欢来代替我喜欢的。所以我试着用小写字母索引entidade:

db=# CREATE INDEX idx_gma_entidade ON gma USING btree
db-#   ( lower(entidade) );
CREATE INDEX
到目前为止,我希望通过以下方式访问完全相同的数据:

但是,正如你所看到的,结果不是我所期望的。。。
有人能解释一下原因吗?如果可能的话,我该如何实现预期的行为?

您不能为此使用btree索引。在搜索字符串的开头使用通配符会使索引无效


使用全文搜索或查看。

您不能为此使用btree索引。在搜索字符串的开头使用通配符会使索引无效


使用全文搜索或查看。

在运行select时,您需要使用列的下部功能:

从gma中选择entidade,其中lowerentidade类似于“%amadeus%”


但是因为前面有一个通配符,所以查询无论如何都不会使用索引。因此,没有必要创建一个

在运行select时,您需要使用列上的lower函数:

从gma中选择entidade,其中lowerentidade类似于“%amadeus%”


但是因为前面有一个通配符,所以查询无论如何都不会使用索引。因此,创建索引没有任何意义。创建索引永远不会改变查询的结果,只会改变查询的实现方式。对于文本列的不区分大小写匹配,必须指定ILIKE或lowercolumn之类的构造“…”。您可以使用citext contrib模块创建默认情况下不区分大小写的citext类型,这似乎是您所需要的。

创建索引永远不会更改查询的结果,只会更改查询的实现方式。对于文本列的不区分大小写匹配,必须指定ILIKE或lowercolumn之类的构造“…”。您可以使用citext contrib模块创建默认情况下不区分大小写的citext类型,这似乎是您想要的。

正如大家指出的,查询没有使用您的索引。您可以在查询前使用explain Analysis关键字来查找是否使用了索引。

正如大家指出的那样,查询没有使用您的索引。您可以在查询前使用explain Analysis关键字来查找是否使用了索引。

感谢一匹没有名字的马,但是。。。你能解释一下创建索引时允许表达式的意义吗?这些表达是如何使用的?如果我从gma中运行SELECT entidade,其中entidade(如“amadeus%”)会使用小写索引吗?@Andre:不会,因为索引表达式不是查询的一部分。该语句从gma中选择entidade,其中lowerentidade类似于“amadeus%”;将使用索引hanks a_horse_,没有名称,但是。。。你能解释一下创建索引时允许表达式的意义吗?这些表达是如何使用的?如果我从gma中运行SELECT entidade,其中entidade(如“amadeus%”)会使用小写索引吗?@Andre:不会,因为索引表达式不是查询的一部分。该语句从gma中选择entidade,其中lowerentidade类似于“amadeus%”;将使用索引
db=# SELECT entidade FROM gma WHERE entidade LIKE '%amadeus%';
 entidade
----------
(0 rows)