2017-01-03 11 views
3

次のPostgresクエリを実行しています。2つの文字列間の距離を計算する

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; 
} 

Iは、入力テキストおよびデータベース内の既存の価値観の両方の間の編集距離を見つけたいです。私は60%の編集距離を持つすべてのデータを取得したい。上記のクエリは期待どおりに機能しません。 60%の類似性を含む行を取得するにはどうすればよいですか?

+2

ここでJavaコードはほとんど無関係です。あなたはデータベースから得た結果は何ですか?あなたが期待している結果は何ですか? **あなたの質問を編集し、そのデータに基づいてサンプルデータと予想される出力を追加してください。 [**フォーマットされたテキスト**](http://stackoverflow.com/help/formatting)、[スクリーンショットなし](http://meta.stackoverflow.com/questions/285551/why-may-i-not -upload-images-of-code-on-so-asking-a-question/285557#285557) –

+0

どのような考えですか?..... –

答えて

1

用途:

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

は、レーベンシュタイン距離は、1つの文字列他になるために(、移動、削除、または挿入)変更する必要がありますどのように多くの文字の数です。簡単に言えば、それはと異なる文字の数です。です。

と同じの文字数は、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文字で、任意の非NULL文字列とすることができます。コストパラメータは、文字の挿入、削除、または置換のそれぞれについて の請求額を指定します。 関数の2番目のバージョンと同様に、コストパラメータを省略することができます。彼ら1.

にすべてのデフォルトだから、デフォルトのコストパラメータで、あなたが得る結果はあなたがsourceで(挿入、削除、または置換により)変更する必要がある文字の合計数である場合 でtargetを取得します。

パーセント差を計算する必要がある場合は、levenshtein関数の結果をソーステキストの長さ(またはターゲットの長さ - パーセント差の定義に従って)で除算する必要があります。この

関連する問題