2011-11-09 77 views
1

繼我上一篇文章Link here後,我們現在面臨的另一個挑戰是找到地址字段[ADDR_LINE_1, ADDR_LINE_2, CITY, STATE, ZIP]的最佳匹配。查找字符串值的最佳匹配 - Oracle/Java

我們希望返回數據庫中的所有記錄,這些記錄可能與來自文件的傳入地址記錄相匹配。場景是:

以下是數據庫中的2條記錄;

ADDR_LINE_1,  ADDR_LINE_2  , CITY  , STATE, ZIP 
001 Chestnut Avenue, Apt 100   , Indiana  , IN , 9999 
Apt 100   , 001 Chestnut Ave., Indianapolis, IN , 9999 

對於來電記錄,如下

ADDR_LINE_1,  ADDR_LINE_2, CITY  , STATE, ZIP 
1 Chestnut Avenue, Apt 100 , Indiana  , IN , 9999 

我要檢測的記錄作爲現有的記錄,並列出了上述兩種可能的匹配。

[注意:]數據庫條目的順序是互換的,但仍應列爲可能的匹配項。

任何人都可以請提供建議,我可以怎麼做呢?

+0

第一階段 - 將「可能匹配」定義爲沒有交手的地方,並強烈定義給定記錄是否可能匹配。第二階段 - 實現這個布爾函數(現在應該很簡單)。 –

+0

感謝您的建議,以下是我至今所能想到的:我至少可以根據某些「常量」值(如City,State,Zipcode)過濾掉記錄。這可能會幫助我縮小範圍。然後,對於地址線1和地址線2中的字符串標記,我可以連接並查找是否至少有1/2個標記匹配,即連接「001 Chestnut Avenue」和「Apt 100」,並與傳入記錄「1 Chestnut Avenue Apt 100「,並在5個字符串標記匹配的第3個字符處找到。這使得整個記錄成爲可能。 –

+0

雖然關於性能,我有點擔心 –

回答

6

根據Oracle版本的不同,您可能可以使用UTL_MATCH package生成相似性分數,然後調整閾值分數對您而言似乎是合理的。例如,有字符串「001板栗大道」和字符串「1板栗大道」使用哈羅 - 溫克勒算法之間96%的相似性

SQL> select utl_match.jaro_winkler_similarity('001 Chestnut Avenue', 
    2           '1 Chestnut Avenue') 
    3 from dual; 

UTL_MATCH.JARO_WINKLER_SIMILARITY('001CHESTNUTAVENUE','1CHESTNUTAVENUE') 
------------------------------------------------------------------------ 
                     96 

很明顯,你可能需要做一些工作確定賦予不同領域的權重 - 例如,假設您的城市門檻較高,可能比地址的第二行相對標準化得多。

+0

謝謝賈斯汀。你再次救了我! :-) –

相關問題