我们有一个交叉点名称表,如'Main St / Broadway Ave'
,我们正在尝试将可能混乱的用户输入(形式为(street1, street2)
(与这些名称相匹配。无法保证输入的顺序与街道名称相同。
我们将交叉口名称拆分为一个长格式表,以便优化进行两次模糊距离比较,例如
+--------+----------------+
| int_id | street |
+--------+----------------+
| 1 | 'Broadway Ave' |
+--------+----------------+
| 1 | 'Main St' |
+--------+----------------+
在街道栏上写一个要点八卦索引。
因此,查询会找到所有接近一个或另一个街道输入的int_id,然后执行GROUP BY
以找到组合距离最近的一个(我稍后会插入查询(。这工作得很好,但我们仍然需要它工作得更快。PostgreSQL的全文搜索库中有什么东西可以做到这一点吗?
函数中使用的查询示例,以及相关说明https://explain.depesz.com/s/J9lj
SELECT intersections.int_id,
SUM(LEAST(
intersections.street <-> street1,
intersections.street <-> street2))
, intersections.int_id
FROM intersections
WHERE (street1 <% intersections.street
OR
street2 <% intersections.street
)
GROUP BY intersections.int_id
HAVING COUNT(DISTINCT TRIM(intersections.street)) > 1
ORDER BY AVG(
LEAST(
intersections.street <-> street1,
intersections.street <-> street2))
我知道你正在寻找PostgreSQL解决方案,但如果你将数据克隆到Elastic Search中并在那里进行搜索,这会更容易(更快(。弹性搜索还为您提供了比关系数据库更大的灵活性。