2017-01-03 146 views
3

執行以下Postgres查詢。計算兩個字符串之間的levenshtein距離

SELECT * FROM description WHERE levenshtein(desci, 'Description text?') <= 6 LIMIT 10; 

使用以下代碼執行上面的查詢。

public static boolean authQuestion(String question) throws SQLException{ 
    boolean isDescAvailable = false; 
    Connection connection = null; 
    try { 
     connection = DbRes.getConnection(); 
     String query = "SELECT * FROM description WHERE levenshtein(desci, ?) <= 6"; 
     PreparedStatement checkStmt = dbCon.prepareStatement(query); 
     checkStmt.setString(1, question); 
     ResultSet rs = checkStmt.executeQuery(); 
     while (rs.next()) {  
      isDescAvailable = true; 
     } 
    } catch (URISyntaxException e1) { 
     e1.printStackTrace(); 
    } catch (SQLException sqle) { 
     sqle.printStackTrace(); 
    } catch (Exception e) { 
     if (connection != null) 
      connection.close(); 
    } finally { 
     if (connection != null) 
      connection.close(); 
    } 
    return isDescAvailable; 
} 

我想找到兩個輸入文本和數據庫中存在的值之間的編輯距離。我想要獲取編輯距離爲60%的所有數據。上述查詢不按預期工作。我如何獲得包含60%相似度的行?

+2

Java代碼在這裏幾乎不相關。你從數據庫中得到的結果是什麼?你期望的結果是什麼。 ** [**]您的問題,並根據該數據添加一些示例數據和預期輸出。 [**格式化文本**](http://stackoverflow.com/help/formatting)請,[無屏幕截圖](http://meta.stackoverflow.com/questions/285551/why-may-i-not - 上傳圖像的代碼的時候,問一個問題/ 285557#285557) –

+0

任何想法?..... –

回答

1

使用此:

SELECT * 
FROM description 
WHERE 100 * (length(desci) - levenshtein(desci, ?)) 
     /length(desci) > 60 

的Levenshtein距離是許多字母必須如何變化(移動,刪除或插入)一個字符串,成爲其他計數。簡而言之,它是不同的字母數

相同的的字母數然後是length - levenshtein

要表示爲分數除以長度即(length - levenshtein)/length

要將分數表示爲百分比,請乘以100

我執行乘法運算100第一個以避免整數除法截斷問題。

+0

你是一個天才兄弟 –

+1

''我知道'' – Bohemian

+0

兄弟......你能解釋我這個查詢是如何工作的......我無法弄清楚這一點......我一直在嘗試過去天瞭解這個.. :( –

1

levenshtein function所述的最一般的版本是:

levenshtein(text source, text target, int ins_cost, int del_cost, int sub_cost) returns int 

源和目標可以是任何非空字符串,具有最大的 255個字符。成本參數指定分別爲 字符插入,刪除或替換收取多少費用。您可以在 中省略成本參數,如第二個版本的功能;在 這種情況下,他們都默認爲1

因此,使用默認參數的成本,你得到的結果是一個字符在source總數你需要改變(通過插入,刪除或替換)得到target

如果您需要計算百分比差異,您應該將levenshtein函數結果除以源文本的長度(或目標長度 - 根據您對百分比差異的定義)。

相關問題