Postgresql:子字符串匹配的 Levenshtein 数

Postgresql: Levenshtein number for substring match

问题:我正在提取长描述字段中包含术语 'posthole' 的行。这些经常被拼错。我使用 Levenshtein 函数创建了一个字段来计算描述与术语 'posthole' 之间的差异,但它匹配整个字符串。我需要找到一种方法来修改它以计算到最接近术语 'posthole'

的字符串的子字符串的距离

解决方案:我唯一能想到的就是将字符串拆分为空格子字符串并将每个子字符串与搜索词匹配。我只是想看看是否有人知道更好的方法。

目前这是纯 PostgreSQL,但如果有处理此问题的模块,我可以将一些 Python 代码插入数据库。

您可以将字符串拆分为单词作为行:

with inputs (id, textcol) as (
  values (1, 'this is a test of postole and some other posthole expressions'),
         (2, 'just another posthole entry')
)
select id, word, levenshtein(upper(word), 'POSTHOLE') 
  from inputs
       cross join lateral regexp_split_to_table(textcol, '\y') r(word) 
 where length(word) > 5
   and levenshtein(upper(word), 'POSTHOLE') < 4
;

┌────┬──────────┬─────────────┐
│ id │   word   │ levenshtein │
├────┼──────────┼─────────────┤
│  1 │ postole  │           1 │
│  1 │ posthole │           0 │
│  2 │ posthole │           0 │
└────┴──────────┴─────────────┘
(3 rows)