2016-09-21 142 views
1

在Rails中,我傳入一個字符串:'AE18BX21'。我正在查詢數據庫以查找與輸入字符串匹配的字符串。但是輸入字符串和數據庫中的字符串有時不匹配。有時會有一個額外的字母/數字,有時會丟失一個字母/數字,或者有時字母/數字是不同的字母/數字。如何匹配字符串與另一個幾乎相同的字符串(模糊匹配)

我已經嘗試了一些不同的正則表達式,如:

Table.where("string =~ ?", 'A+E+1+8+B+X+2+1') 

Table.where("string =~ ?", '(A|.)+(E|.)+(1|.)+(8|.)+(B|.)+(X|.)+(2|.)+(1|.)') 

在一個理想的世界,我希望它僅返回匹配80%以上的字符串。

+0

我認爲你正在尋找類似Levenshtein距離,但不知道你正在使用什麼數據庫引擎,以及它是否支持它。與你的第一個正則表達式有關,你可以嘗試:'Table.where(「string =〜?」,'A * E * 1 * 8 * B * X * 2 * 1 *')' –

+0

是的,我沒有想過Levenshtein距離。我正在使用PostgresSQL。我檢查一下。 – cal1801

回答

0

看完你的問題之後,我想你想要一些像Levenshtein距離的東西,正如你在評論中所說的那樣,對於Postgres你可以使用它。

這裏引用它的文檔: https://www.postgresql.org/docs/9.1/static/fuzzystrmatch.html

test=# SELECT levenshtein('GUMBO', 'GAMBOL'); 
levenshtein 
------------- 
      2 
(1 row) 

test=# SELECT levenshtein('GUMBO', 'GAMBOL', 2,1,1); 
levenshtein 
------------- 
      3 
(1 row) 

test=# SELECT levenshtein_less_equal('extensive', 'exhaustive',2); 
levenshtein_less_equal 
------------------------ 
         3 
(1 row) 

test=# SELECT levenshtein_less_equal('extensive', 'exhaustive',4); 
levenshtein_less_equal 
------------------------ 
         4 
(1 row) 

然後你就可以用你的願望距離建立你的SQL查詢:

SELECT * 
FROM YourTable 
WHERE levenshtein(string , 'AE18BX21') <= 2 
+0

感謝您的鏈接。幫了很多。我將得到fuzzystrmatch安裝到postgres中,這將是驚人的! – cal1801