PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Strings UTF-8 semelhantes para campo de preenchimento automático


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.