背景
用户可以输入名称并且系统应该匹配文本,即使用户输入或数据库字段包含重音 (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 ) ) );
这仅返回一个结果:
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