Cadenas UTF-8 similares para autocompletar el campo
Los usuarios pueden escribir un nombre y el sistema debe coincidir con el texto, incluso si la entrada del usuario o el campo de la base de datos contienen caracteres acentuados (UTF-8). Esto está usando elpg_trgm
módulo.
El código se parece a lo siguiente:
<code> SELECT t.label FROM the_table t WHERE label % 'fil' ORDER BY similarity( t.label, 'fil' ) DESC </code>
Cuando el usuario escribefil
, la consulta coincidefilbert
pero nofilé powder
. (¿Por el carácter acentuado?)
Traté de implementar unno acento Funciona y reescribe la 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>
Esto devuelve solamentefilbert
.
Como se sugiere:
<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 los demás índices en la tabla han sido eliminados. Entonces:
<code>CREATE INDEX label_unaccent_idx ON the_table( lower( unaccent_text( label ) ) ); </code>
Esto devuelve solo un resultado:
<code> SELECT t.label FROM the_table t WHERE label % 'fil' ORDER BY similarity( t.label, 'fil' ) DESC </code>Pregunta
¿Cuál es la mejor manera de volver a escribir la consulta para garantizar que se devuelvan ambos resultados?
¡Gracias!
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