当我使用模糊匹配编辑带有变音符号的函数会返回错误/多字节无知的结果:
select levenshtein('ą', 'x');
levenshtein
-------------
2
(注意:第一个字符是一个“a”,下面有一个变音符号,我复制到这里后它没有正确呈现)
The 模糊匹配文档(https://www.postgresql.org/docs/9.1/fuzzystrmatch.html https://www.postgresql.org/docs/9.1/fuzzystrmatch.html)警告:
目前,soundex、metaphone、dmetaphone 和 dmetaphone_alt 函数不能很好地处理多字节编码(例如 UTF-8)。
但由于它没有命名编辑函数,我想知道是否有多字节感知版本编辑.
我知道我可以使用unaccent作为一种解决方法,但我需要保留变音符号。
注意:这个解决方案是由 @Nick Barnes 在他的文章中建议的answer https://stackoverflow.com/a/56688419/11637535 to a 相关问题 https://stackoverflow.com/q/56683034/11637535.
带有变音符号的“a”是一个字符序列,即a和一个组合字符,变音符号 ̨ :E'a\u0328'
有一个等效的预组合字符ą: E'\u0105'
一个解决方案是正常化 http://www.unicode.org/reports/tr15/Unicode 字符串,即在比较它们之前将组合字符序列转换为预组合字符。
不幸的是,Postgres 似乎没有内置的 Unicode 规范化函数,但您可以通过PL/Perl https://www.postgresql.org/docs/current/plperl.html or PL/Python https://www.postgresql.org/docs/current/plpython.html语言扩展。
例如:
create extension plpythonu;
create or replace function unicode_normalize(str text) returns text as $$
import unicodedata
return unicodedata.normalize('NFC', str.decode('UTF-8'))
$$ language plpythonu;
现在,作为字符序列E'a\u0328'
映射到等效的预组合字符E'\u0105'
通过使用unicode_normalize
,编辑距离是正确的:
select levenshtein(unicode_normalize(E'a\u0328'), 'x');
levenshtein
-------------
1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)