是否有支持多字节的 Postgresql Levenshtein?

2024-01-03

当我使用模糊匹配编辑带有变音符号的函数会返回错误/多字节无知的结果:

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(使用前将#替换为@)

是否有支持多字节的 Postgresql Levenshtein? 的相关文章

随机推荐

  • 提高字典模糊字符串匹配的性能

    所以我目前正在使用第二弦 http secondstring sourceforge net 对于模糊字符串匹配 我有一个大字典可以比较 字典中的每个条目都有一个关联的非唯一标识符 我目前正在使用 hashMap 来存储这本字典 当我想要进
  • 需要加入列表的元素,但加入后保留元素周围的 ''

    我的清单是 example a b c 如果我使用 join example 去除 围绕元素 我希望我的输出是 example a b c 有什么优雅的方法可以做到吗 不确定它是否优雅 但它可以工作 基于默认表示list对象 因此根本不灵活
  • Google App Engine——Java 还是 Python? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我注意到这是在以下帖子 https stackoverflow com questions 1085898 choosing java vs p
  • 如何使用 vue-i18n 加载我真正需要的语言文件?

    使用 vue i18n 可以很容易地翻译你的 Vue js 应用程序 但随着项目的增长 您不想加载所有语言的所有消息 大多数用户从不切换语言 我们为每种语言都有单独的域 并且切换语言的情况极为罕见 所以 vue i18n 似乎支持延迟加载
  • Kubernetes 上的多代理 Kafka 如何设置 KAFKA_ADVERTISED_HOST_NAME

    我当前包含 3 个 Kafka 代理的 Kafka 部署文件如下所示 apiVersion apps v1beta1 kind StatefulSet metadata name kafka spec selector matchLabel
  • 如何在 Android 中在按钮上显示动态文本并自动调整其大小?

    我正在开发一个项目 需要我根据用户在按钮上的选择来显示一些动态文本 我知道如何进行文本显示部分 但我一直困惑于如何在固定大小的按钮上正确显示不同的文本 例如 苹果 和 我有一个苹果 如何才能达到显示 苹果 时文字尺寸变大适合按钮 而显示 我
  • pylint 1.4 报告所有 C 扩展上的 E1101(无成员)

    我们一直是pylint 它的静态分析已经成为我们所有 python 项目的关键部分 并且节省了大量的时间来追踪隐藏的错误 但从 1 3 gt 1 4 升级后 几乎所有编译的 c 扩展都会导致 E1101 no member 错误 之前运行完
  • 如何在Python中合并两个嵌套的字典?

    我有两个嵌套的字典数据 我想将它们合并以在 python 中创建一本字典 词典数据 dict1 employee dev1 Roy dict2 employee dev2 Biswas 现在我试图用它们创建一个像下面这样的字典 所需输出 d
  • 从文件路径中提取文件扩展名

    如何提取给定文件路径的文件扩展名作为字符 我知道我可以通过正则表达式来做到这一点regexpr alnum x 但想知道是否有内置函数可以处理这个问题 使用 R 基本工具很容易找到这种东西 例如 路径 无论如何 加载tools打包并读取 f
  • 允许使用 docker-machine 配置的主机中存在不安全的注册表

    有没有什么可以配置的 允许不安全 ssl用于使用 docker machine 创建的 docker 守护进程 命令 docker machine create driver virtualbox dev eval docker machi
  • 不同状态下不同的词法分析器规则

    我一直在为 HTML 中嵌入的某些模板语言 FreeMarker 开发解析器 例如 abc h1 Welcome user lt if user Big Joe gt our beloved leader h1 p Our latest p
  • 是否可以创建一个没有 EOF 标记的文件?

    我们有一个读取平面文件并解析数据的应用程序 该文件不包含用于进行校验和的标头信息或总数据 所以我想创建测试用例以确保我们的应用程序正确处理 不完整 文件 有没有办法创建没有 EOF 标记的平面文件 也许有一个工具可以用来从现有文本文件中删除
  • 仅允许管理员删除文件?

    我正在编写一个 C 应用程序 我想设置 在应用程序启动时 权限 以便只有管理员才能删除应用程序使用的文件 所有其他用户不应删除它或修改其权限 应保护该文件免受标准文件系统使用的影响 因此 除了管理员之外 没有人可以删除它 只有管 理员应该能
  • DOMDocument::loadHTMLFile() 修改用户代理

    我使用 PHP 在 DOM 树中加载网站 有没有办法修改使用发送的用户代理DOMDocument loadHTMLFile function parseThis url html new DOMDocument html gt loadHt
  • 在 Android 应用程序中播放背景声音

    我想在我制作的应用程序中播放背景声音 帮我看看我该怎么做 这是完整的代码 public class Numbers extends Activity public static MediaPlayer mp null Override pr
  • input['file']accept="image/*" 用 Chrome 打开对话框太慢了

    当我使用
  • Anaconda 3.5(64位Windows)安装cx_Oracle

    我已经安装了适用于 Windows 64 位的 Anaconda 3 5 并且需要使用包 cx Oracle 连接到 Oracle 数据库 我尝试使用 anaconda 方式 conda install c https conda anac
  • 运行 json_encode 后替换 \r\n (换行符)

    因此 当我运行 json encode 时 它 也会从 MySQL 获取 r n 我尝试重写数据库中的字符串但无济于事 我尝试将 MySQL 中的编码从默认的 latin1 swedish ci 更改为 ascii bin 和 utf8 b
  • Unicode 字符使用统计[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找有关文本文档 带有任何标记 中 Unicode 字符使用情况的一些统计数据 谷歌搜索没有结果 背景 我目前正在开发一种基于有限状
  • 是否有支持多字节的 Postgresql Levenshtein?

    当我使用模糊匹配编辑带有变音符号的函数会返回错误 多字节无知的结果 select levenshtein a x levenshtein 2 注意 第一个字符是一个 a 下面有一个变音符号 我复制到这里后它没有正确呈现 The 模糊匹配文档