Você não está usando a classe de operador fornecida pelo
pg_trgm
módulo. Eu criaria um índice assim:CREATE INDEX label_Lower_unaccent_trgm_idx ON test_trgm USING gist (lower(unaccent_text(label)) gist_trgm_ops);
Originalmente, eu tinha um índice GIN aqui, mas depois aprendi que um GiST provavelmente é ainda mais adequado para esse tipo de consulta porque pode retornar valores classificados por similaridade. Mais detalhes:
- Postgresql:padrões de correspondência entre duas colunas
- Encontrando strings semelhantes com o PostgreSQL rapidamente
Sua consulta deve corresponder à expressão de índice para poder usá-la.
SELECT label
FROM the_table
WHERE lower(unaccent_text(label)) % 'fil'
ORDER BY similarity(label, 'fil') DESC -- it's ok to use original string here
No entanto, "filbert" e "filé em pó" não são muito semelhantes a "fil" de acordo com o operador %. Eu suspeito que o que você realmente quer é isso:
SELECT label FROM the_table WHERE lower(unaccent_text(label)) ~~ '%fil%' ORDER BY similarity(label, 'fil') DESC -- it's ok to use original string here
Isso encontrará todas as strings que contêm a string de pesquisa e classificará as melhores correspondências de acordo com o
%
operador primeiro. E a parte interessante:a expressão pode usar um índice GIN ou GiST desde o PostgreSQL 9.1 ! Cito o manual do moule pg_trgm:
A partir do PostgreSQL 9.1, esses tipos de índice também suportam pesquisas de índice para LIKE e ILIKE, por exemplo
Se você realmente pretendia usar o
%
operador:Você tentou reduzir o limite para o operador de similaridade
%
com set_limit()
:SELECT set_limit(0.1);
ou até mais baixo? O padrão é 0,3. Apenas para ver se é o limite que filtra correspondências adicionais.