0

首先,在详细说明我正在处理的问题之前,让我告诉你,我目前是 SQL 新手,所以只要有可能,我会感谢简单的解释和简单的解决方案。这是我所拥有的:

鉴于此查询:

        SELECT 
        table1.id as id, 
        table1.tag1 as tag1, 
        table2.tag2 as tag2,
        table2.tag2 like '%'+table1.tag1'%' as match


        FROM table1
        INNER JOIN table2
        ON table1.id = table2.id

我得到这张桌子:

id     tag1         tag2           match
1      ice cream    ice-cream      false
2      sweets       sweets         true
3      bakery       bakery         true
4      sweets       ice-cream      false

我要解决的问题是我希望“匹配”列解释为与第一行中的“真实”相似的词。因此,在我想要的输出中,我希望这个提到的单元格是“真”而不是“假”。

提前致谢。

4

3 回答 3

2

“相似”可以通过几种方式进行估计。有些方法是……精心制作的。一个好的起点是“编辑距离”。这也以其创建者的名字命名为“Levenshtein distance”。这个想法很容易理解,结果也很有意义。(这听起来也很像您所要求的。)虽然存在变化,但基本思想是计算需要更改多少字符才能将一个字符串转换为另一个字符串。所以“冰淇淋”到“冰淇淋”需要一个变化。那很接近。“冰淇淋”到“美好的梦想”需要更多的变化。您可以查找该算法并通过很好的示例找到很多关于它的信息。言归正传,拼写检查员传统上将这种算法放在他们的技巧包中。那'

默认情况下 Postgres 中不启用 Levenshtein,但它包含在名为“fuzzystrmatch”的标准扩展中:

https://www.postgresql.org/docs/current/fuzzystrmatch.html

该扩展还包括一些“语音”匹配算法,这些算法听起来不像你所追求的。根据您的部署方式,还有一个带有一堆模糊字符串匹配工具的扩展,但老实说,无论如何我都会从 Levenshtein 开始。

https://github.com/eulerto/pg_similarity

如果您最终使用 RDS,则支持 pg_similarity。

您可能会听到的其他建议包括 LIKE、正则表达式和三元组(很棒!但涉及更多)。

模糊字符串匹配是一个很大的主题,而且非常有趣。如果您进一步追求这一点,这将有助于了解您正在处理什么样的记录计数,您的字符串有多长(较短的字符串更难以模糊比较,因为没有那么多可使用),您的 Postges 版本等.

于 2019-09-13T12:15:45.040 回答
0

@Morris'es 的回答对 Postgres 有好处。在您使用 Refshift 时,您可以创建一个用于模糊匹配的 Python UDF,它以 2 个字符串作为输入并返回二进制判断或这些字符串之间的某种相似性度量。这是使用 Python UDF 实现 Levenshtein 算法的一个很好的例子:Periscope community thread

该函数返回两个单词之间的字符串“距离”(有多少个字符不同)。

您可以将输出用作levenshtein(table2.tag2,table1.tag1)<=1 as match

于 2019-09-14T14:28:06.197 回答
0

你需要准确地决定你想要什么作为匹配。让我假设一个空格可以匹配任何字符。然后使用:

table2.tag2 like '%' + replace(table1.tag1, ' ', '_') + '%' as match

或者,您可能希望删除所有空格和连字符以进行比较:

replace(replace(table2.tag2, ' ', ''), '-', '') like '%' + replace(replace(table1.tag1, ' ', ''), '-', '') + '%'
于 2019-09-13T11:35:56.347 回答