当我将fuzzystormatch levenshtein函数与变音字符一起使用时,它返回一个错误的/多字节的无知结果:

select levenshtein('ą', 'x');
levenshtein
-------------
       2

(注意:第一个字符是一个“a”,下面有一个变音符号,在我复制到这里之后,它没有正确地呈现)
fuzzystormatch文档(https://www.postgresql.org/docs/9.1/fuzzystrmatch.html)警告:
目前,soundex、metaphone、dmetaphone和dmetaphone_alt功能在多字节编码(如UTF-8)中不太适用。
但由于它没有命名levenshtein函数,我想知道是否有一个多字节的levenshtein版本。
我知道我可以使用uncent函数作为解决方法,但我需要保留变音符号。

最佳答案

注意:这个解决方案是由@Nick Barnes在他的answer到arelated question中提出的。
带变音符号的“a”是一个字符序列,即a和组合字符的组合,变音符号̨:E'a\u0328'
有一个等效的预合成字符ą:E'\u0105'
解决方案是normaliseUnicode字符串,即在比较之前将组合字符序列转换为预组合字符。
不幸的是,Postgres似乎没有内置的Unicode规范化功能,但是您可以通过PL/PerlPL/Python语言扩展轻松访问一个。
例如:

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时,levenshtein距离是正确的:
select levenshtein(unicode_normalize(E'a\u0328'), 'x');
levenshtein
-------------
           1

关于postgresql - 有多字节感知的Postgresql Levenshtein吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56676187/

10-12 19:49