Sequências UTF-8 semelhantes para campo de preenchimento automático
Os usuários podem digitar um nome e o sistema deve corresponder ao texto, mesmo se o campo de entrada ou de banco de dados do usuário contiver caracteres acentuados (UTF-8). Isso está usando opg_trgm
módulo.
O código é semelhante ao seguinte:
<code> SELECT t.label FROM the_table t WHERE label % 'fil' ORDER BY similarity( t.label, 'fil' ) DESC </code>
Quando o usuário digitafil
, a consulta correspondefilbert
mas nãofilé powder
. (Por causa do caráter acentuado?)
Eu tentei implementar umdescentramento função e reescrever a consulta como:
<code> SELECT t.label FROM the_table t WHERE unaccent( label ) % unaccent( 'fil' ) ORDER BY similarity( unaccent( t.label ), unaccent( 'fil' ) ) DESC </code>
Isso só retornafilbert
.
Como sugerido:
<code>CREATE EXTENSION pg_trgm; CREATE EXTENSION unaccent; CREATE OR REPLACE FUNCTION unaccent_text(text) RETURNS text AS $BODY$ SELECT unaccent($1); $BODY$ LANGUAGE sql IMMUTABLE COST 1; </code>
Todos os outros índices na tabela foram descartados. Então:
<code>CREATE INDEX label_unaccent_idx ON the_table( lower( unaccent_text( label ) ) ); </code>
Isso retorna apenas um resultado:
<code> SELECT t.label FROM the_table t WHERE label % 'fil' ORDER BY similarity( t.label, 'fil' ) DESC </code>Questão
Qual é a melhor maneira de reescrever a consulta para garantir que ambos os resultados sejam retornados?
Obrigado!
Relacionadohttp://wiki.postgresql.org/wiki/What%27s_new_in_PostgreSQL_9.0#Unaccent_filtering_dictionary
http://postgresql.1045698.n5.nabble.com/index-refuses-to-build-td5108810.html