如何使用 ~ 模糊匹配 table 的两个字段?

How can I use ~ to fuzzy match two fields of a table?

我正在尝试对包含相同公司信息的两个 table 执行连接,但有时这些公司的存储名称略有不同(例如 table 1:公司 X -> Table 2:X 公司和朋友)。 我的想法是将 table 1 的每一行与 table 2 的每一行完全连接起来,然后使用 ~ 进行过滤(例如,name1 ~ name2 或 name2 ~ name1),但这是不可能的。

有人能解决这个匹配问题吗? 谢谢!

您可以加​​入,条件是其中一个名称字段是另一个名称字段的子字符串:

SELECT t1.*, t2.*
FROM table1 t1
INNER JOIN table2 t2
    ON t1.name LIKE '%' || t2.name || '%' OR
       t2.name LIKE '%' || t1.name || '%';

这种方法甚至不需要正则表达式。我们可以在这里使用正则表达式,如果我们想确保一个 table 的名字只作为另一个名字的子字符串出现 并且 也是一个词。但是,也许你甚至不需要这样做。

你可以

CREATE EXTENSION pg_trgm;

并在连接条件中使用它提供的相似性运算符:

t1 JOIN t2 ON t1.name % t2.name

您可以使用pg_trgm提供的“<->”运算符或'%'运算符进行模糊字符串匹配。

你必须做出决定,比如你愿意为“%”使用什么相似性截止(return 如果最佳匹配低于该值,则没有匹配),如果你只想 return顶级匹配(横向连接对此有好处)或可能不止一个。

最好使用它来清理您的数据,而不是直接将其合并到生产应用程序中。

您可能还需要删除令人讨厌的词。 "Company X and friends" 与 "Company Y and friends" 的相似度要高于 "Company X limited"。

SELECT t1.*, t2.*, 1- (t1.name <-> t2.name) as similarity
FROM table1 t1
INNER JOIN table2 t2
    ON t1.name % t2.name
order by t1.name <-> t2.name;