Индекс Postgresql в нижнем регистре (столбец) не работает должным образом? - PullRequest
0 голосов
/ 14 февраля 2011

Ниже приведен пример данных, которые можно получить при поиске подстроки «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)

Но, как видите, результат не тот, который я ожидал ... Может ли кто-нибудь объяснить, почему? И, если возможно, как я могу достичь ожидаемого поведения?

Ответы [ 3 ]

2 голосов
/ 14 февраля 2011

Вам нужно использовать функцию lower () для столбца при запуске выбора:

SELECT entidade FROM gma WHERE lower(entidade) LIKE '%amadeus%';

Но так как у вас есть подстановочный знак в начале, запрос никогда не будет использовать индекс в любом случае. Так что нет смысла создавать один

2 голосов
/ 14 февраля 2011

Для этого нельзя использовать индексы btree.Использование подстановочного знака в начале строки поиска делает индекс бесполезным.

Используйте полнотекстовый поиск или посмотрите на wildspeed .

1 голос
/ 14 февраля 2011

Создание индекса никогда не должно изменять результат запроса, только то, как он реализован . Вы должны указать ILIKE или конструкцию, такую ​​как lower(column) LIKE '...', для сопоставления без учета регистра для текстового столбца. Вы можете использовать модуль citext contrib для создания типа citext, который будет соответствовать регистронезависимому по умолчанию, что, как вам кажется, и нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...