使用索引改进postgresql中文本列的levenstein距离比较



我有一个表,其中每行有两列名称,表示一个交集。还有第二个表,其中每一行显示一个与对象id相关的十字路口的一条街道。我想做的是,在第二个表格中搜索我的第一个表的每一行,并找到两个名称匹配的十字路口的对象。用于匹配的函数使用levenstein距离,并将第一个表中的两个名称中的每一个与第二个表中所有的名称进行比较,如果它们与具有相同对象的两个记录匹配,则返回信息。然后我把它和第三个表连接起来,得到每个对象的所有信息。函数使用第二个表。

SELECT a.*,
int_func[3] as int_id_func,
intersec5,
b.longitude as int_long,
b.latitude as int_lat,
b.geom
FROM 
(
SELECT ft.*, gis._get_intersection_id(ft.stname1,   ft.stname2, 0) AS int_func
FROM first_table  AS ft
) as a
JOIN third_table b ON a.int_func[3] = b.int_id

我的问题是什么是最好的指数选择。到目前为止,我使用的任何东西都不起作用。当我使用Explain时,它没有使用任何索引。

我还注意到了这个解决方案,它在函数上应用了GIST

CREATE INDEX lev_idx ON table1 USING GIST(levenshtein(string,'ciao'));

但我不确定,如何才能更改索引的第二个参数。

我不知道有任何有意义的方式可以对Levenstein进行索引。

在您显示的示例中,不能更改第二个参数(如果不构建一个全新的索引(。这就是为什么这不是一种有意义的索引Levenstein的方法——您不能自由使用任意参数。

您可以考虑使用pg_trgm定义的距离运算符。它可以被索引,尽管不清楚在字符串长度不相等的情况下索引会有多有用。

如果您给出示例数据,而不是只抛出一个既没有表结构也没有数据的查询,您可能会得到更好的结果。

最新更新