代码之家  ›  专栏  ›  技术社区  ›  ufk

postgresql 10.1中的utf-8字符串相似性

  •  0
  • ufk  · 技术社区  · 7 年前

    :)我试图在PostgreSQL 10.1中找到字符串的相似性。

    我使用扩展名 unaccent pg_trgm 并使他们能够:

    create extension unaccent;
    create extension pg_trgm;
    

    问题是 pg_trgm 不提供utf8支持。因此,如果我执行:

    select similarity('כפיר','כפיר');
    

    它返回的相似性为零。

    iso-8859-8 支持希伯来语和英语的编码,我在本例中使用的语言。

    但首先我想 绳子,如果我有 כפיר - ƒ כפיר - f 因此,它将正确地转换为所需的字符编码。

    所以 select unaccent('כפיר - ƒ'); 返回正确的结果。

    不幸的是:

    select convert(unaccent('כפיר - ƒ'),'UTF8','ISO_8859_8');
    

    返回

    [42883]错误:函数转换(文本,未知,未知)不存在提示:没有与给定名称和参数类型匹配的函数。您可能需要添加显式类型转换。职位:8

    当我在 https://www.postgresql.org/docs/9.1/functions-string.html 关于 convert() 函数,它需要一个字符串。

    如果我试着把某样东西当作弦,我会得到它 type "string" does not exist

    好啊因此,使用uncent是我需要解决的第一个问题(也许是唯一的问题)。我接下来所做的是返回正确的结果,而没有看到正确的希伯来语字符串。

    我的意思是。。

    select convert('כפיר','UTF-8','ISO_8859_8'); 返回

    4 B 00000000  EB F4 E9 F8                                        ëôéø
    

    并用 select convert('כפיר','UTF8','ISO_8859_8')::text; 返回 \xebf4e9f8

    因此,如果我不使用重音并执行:

    select similarity(convert('כפייר עזר','UTF8','ISO_8859_8')::text, convert('כפיר','UTF8','ISO_8859_8')::text);
    

    它返回的相似性为0.5,这是正常的。

    1. 如何投 不相关 正确地使用它 convert
    2. 我是否正确地将utf-8希伯来语字符串转换为ASCII?
    3. 我是否试图以正确的方式解决这个问题?是否有支持utf-8的相似性函数的不同扩展?
    4. 在执行相似性函数之前,我还想从字符串中删除任何非字母数字的字符,以便根据需要获得更好的相似性结果。我考虑使用正则表达式将字符串转换为ASCII。比如: regexp_replace('string', '\W+', '', 'g')

    非常感谢。

    1 回复  |  直到 7 年前
        1
  •  1
  •   ufk    7 年前

    好的,所以解决方法很简单。

    需要将其转换为字节数组( bytea )然后返回文本。 关于正则表达式替换,我应该使用我想要删除的特定字符,而不是使用 \W+ .

    因此,我的案例的解决方案是:

       select
      similarity(convert(unaccent(regexp_replace(lower('string'), '[.,''׳`"-]', '', 'g'))::bytea,'UTF8','ISO_8859_8')::text,
                 convert(unaccent(regexp_replace(lower('string'), '[.,''׳`"-]', '', 'g'))::bytea,'UTF8','ISO_8859_8')::text)