Podobne ciągi UTF-8 dla pola autouzupełniania

tło

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ł.

Problem

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?)

Nieudane rozwiązanie # 1

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.

Nieudane rozwiązanie # 2

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 z

http://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

questionAnswers(2)

yourAnswerToTheQuestion