簡體   English   中英

使用索引改進 postgresql 中文本列的列文斯坦距離比較

[英]Improve the levenstein distance comparison on text columns in postgresql using index

我有一個表,其中每一行都有兩列代表交叉點的名稱。 還有第二個表,其中每一行表示由 object id 相關的交叉口的一條街道。 我想要做的是,在第二個表中搜索我的第一個表的每一行,並找到兩個名稱都匹配的交集的 objectid。 function進行匹配,使用列文斯坦距離並將第一個表中的兩個名稱中的每一個與第二個表中的所有名稱進行比較,如果它們與具有相同 objectid 的兩條記錄匹配,則返回信息。 然后我將它與第三個表連接起來以獲取每個 objectid 的所有信息。 function 使用第二個表。

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

我的問題是什么是最好的索引選項。 到目前為止,我使用的任何東西都不起作用。 當我使用解釋時,它沒有使用任何索引。

我還注意到這個解決方案,它在 function 上應用 GIST,

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

但我不確定如何更改索引的第二個參數。

我不知道可以對 Levenshtein 進行索引的任何有意義的方式。

在您展示的示例中,無法更改第二個參數(無需構建全新的索引)。 這就是為什么這不是一種有意義的索引 Levenshtein 的方式——你不能隨意使用任意參數。

您可以考慮改用 pg_trgm 定義的距離運算符。 它可以被索引,盡管在字符串長度相當不等的情況下索引的用處尚不清楚。

如果您提供示例數據,而不是僅僅向我們拋出既沒有表結構也沒有數據的查詢,您可能會得到更好的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM