Postgresql levenshtein距离群

Postgresql levenshtein距离群,postgresql,levenshtein-distance,Postgresql,Levenshtein Distance,我有postgreSQL 9.2 我的任务是在表中查找相似的名称(受一些levenshtain距离的限制) 例如,距离为3,表中有数据: | name | |***************************| | Marcus Miller | | Marcos Miller | | Macus Miler | | David Bowie | |

我有postgreSQL 9.2

我的任务是在表中查找相似的名称(受一些levenshtain距离的限制)

例如,距离为3,表中有数据:

|           name            |
|***************************|
|       Marcus Miller       |
|       Marcos Miller       |
|       Macus Miler         |
|       David Bowie         |
|       Dave Grohl          |
|       Dav Grol            |
|           ...             |
我想得到的结果如下:

|       Marcus Miller, Marcos Miller, Macus Miler       |
|       Dave Grohl, Dav Grol                            |
|           ...                                         |

我试过这个:

SELECT a.name, b.name
FROM my_table a
JOIN my_table b ON b.id < a.id AND levenshtein(b.name, a.name) < 3;
选择a.name,b.name
从我的桌子a
在b.id

但是我的数据太慢了。

你的问题在概念上有重大错误
groupby
将某些(在数学意义上)作为参数,并将其用于SQL关系

问题是,您描述的关系,即“两个字符串在彼此的特定编辑距离内”,不是等价关系。它是对称的和自反的,但不是传递的。举例来说,如果我向您的数据集中添加了一系列名称,这些名称将“Marcus Miller”变形为“Dave Grohl”,并且该系列中的每个名称都在与前一个名称的编辑距离之内,那么答案应该是什么


然而,有一些算法使用非等价关系(如几何距离)来划分数据集。是最著名的例子之一。也许有一种方法可以适应k-means或类似于这个问题的东西,我不知道。

groupby
idea是一个非启动的想法-选择Select\u levenshtein\u Group\u func\u('Marcus Miller',3)be的输出是什么?换句话说:你可以有3个名字a,b和c,这样从a到b的Levenshtein距离是3,从b到c的距离是3;因此组将是(a,b),(b,a,c)和(c,b)-SQL Group By无法将同一条目放入多个组中,因此无法生成该结果。顺便说一句,您的模拟查询也不正确,
HAVING
子句应为
HAVING count(*)>1
,如
count(grouped\u列)
的定义总是1。为什么
的计数(分组列)
总是1?例如,查询
按COUNT(name)>1的名称从用户组中选择名称
返回用户名,用户名不是唯一的。嗯,你说得对,它会,因为
COUNT(name)
统计组中
name
的非空值的数量,即使它们都是相同的(与
COUNT(DISTINCT name)
相反,COUNT(DISTINCT name)总是1)
COUNT(1)
COUNT(*)
将是相同的,除非
name
中存在
NULL
值,并且对读者来说更为明显
COUNT(某些函数(名称))
特别不直观,因为该函数通常不相关。使用levenstein无法做到这一点,请查看@lpsmith对原因的回答。但是,如果要按所有听起来相似的名称进行分组,可以使用
soundex()
metaphone()
函数(位于同一模块中)
SELECT a.name, b.name
FROM my_table a
JOIN my_table b ON b.id < a.id AND levenshtein(b.name, a.name) < 3;