バックグラウンド
ユーザー入力またはデータベース フィールドにアクセント付き (UTF-8) 文字が含まれている場合でも、ユーザーが名前を入力すると、システムはそのテキストを照合する必要があります。これはpg_trgm
モジュールを使用しています。
問題
コードは次のようになります。
SELECT
t.label
FROM
the_table t
WHERE
label % 'fil'
ORDER BY
similarity( t.label, 'fil' ) DESC
ユーザーがを入力fil
すると、クエリは一致しますが、一致filbert
しませんfilé powder
。(アクセントキャラのせい?)
失敗した解決策 #1
unaccent関数を実装して、クエリを次のように書き直そうとしました。
SELECT
t.label
FROM
the_table t
WHERE
unaccent( label ) % unaccent( 'fil' )
ORDER BY
similarity( unaccent( t.label ), unaccent( 'fil' ) ) DESC
これは のみを返しますfilbert
。
失敗した解決策 #2
提案どおり:
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;
テーブルの他のすべてのインデックスは削除されました。それで:
CREATE INDEX label_unaccent_idx
ON the_table( lower( unaccent_text( label ) ) );
これは 1 つの結果のみを返します。
SELECT
t.label
FROM
the_table t
WHERE
label % 'fil'
ORDER BY
similarity( t.label, 'fil' ) DESC
質問
両方の結果が確実に返されるようにクエリを書き直す最善の方法は何ですか?
ありがとうございました!
関連している
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