Podobne ciągi UTF-8 dla pola autouzupełniania
Użytkownicy mogą wpisać nazwę, a system powinien pasować do tekstu, nawet jeśli dane wprowadzone przez użytkownika lub pole bazy danych zawiera znaki akcentowane (UTF-8). To jest użyciepg_trgm
moduł.
Kod przypomina następujące:
<code> SELECT t.label FROM the_table t WHERE label % 'fil' ORDER BY similarity( t.label, 'fil' ) DESC </code>
Kiedy użytkownik wpiszefil
, zapytanie pasujefilbert
ale niefilé powder
. (Z powodu znaku akcentowanego?)
Próbowałem wdrożyćnieostry funkcja i przepisanie zapytania jako:
<code> SELECT t.label FROM the_table t WHERE unaccent( label ) % unaccent( 'fil' ) ORDER BY similarity( unaccent( t.label ), unaccent( 'fil' ) ) DESC </code>
To zwraca tylkofilbert
.
Jak sugerowano:
<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>
Wszystkie inne indeksy w tabeli zostały usunięte. Następnie:
<code>CREATE INDEX label_unaccent_idx ON the_table( lower( unaccent_text( label ) ) ); </code>
Zwraca tylko jeden wynik:
<code> SELECT t.label FROM the_table t WHERE label % 'fil' ORDER BY similarity( t.label, 'fil' ) DESC </code>Pytanie
Jaki jest najlepszy sposób przepisania zapytania, aby zapewnić, że oba wyniki zostaną zwrócone?
Dziękuję Ci!
Związane zhttp://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