JSON和JSONB类型意味着具有不同含义标记的元素的数据。这通常意味着,这些不同的要素不能以完全相同的方式得到有效的处理,这进一步意味着一刀切的方法可能不会取得好的结果。
正如你所提到的那样,Levenshtein距离是一种可能的方法,但大多数情况下它必须以某种方式加权定制到您的特定数据,甚至可能不足以满足大多数实际情况数据集。
例如,考虑一些基本地址。匹配街道号码本身毫无意义。同上街道名称。真正的所有元素都是依赖的,只有从匹配的国家开始,通过州/省等进行下去时,“相似性”才具有真正的意义。简单的权重无法捕捉到这种类型的关系。
解决方案是使用存储过程来确定给定表中的行之间的相似性。虽然PL/pgSQL可以用于此(并且对于简单的表格可以很好地工作),但当事情变得复杂时,可能需要深入挖掘PL/Python之类的东西。当然,这些存储过程的效率与它们的写法有很大的不同,但即使在大型数据库中使用时,它们也可以很好地执行。
例如(而且也没有足够的信息在你的问题做出的东西,将直出在这里工作,所以请把这样的东西比伪要好一些,但不是彻底的测试PL/Python)的:
CREATE OR REPLACE FUNCTION compare_json_addresses(addr1 JSON, addr2 JSON)
RETURNS INTEGER AS
$$
BEGIN
import simplejson as json
a1, a2 = json.loads(addr1), json.loads(addr2)
similarity = 0
for unit in ('country', 'state', 'town', 'street', 'num'):
if a1[unit] != a2[unit]:
break
else:
similarity += 1
return similarity
END;
$$
LANGUAGE plpythonu STRICT IMMUTABLE;
显然你必须修改它以考虑你正在使用的各种附加位置字段,并弄清楚你希望它们如何关联。
通常您会使用全文搜索索引,但我不确定这是否适用于Json数据。 –