2017-01-03 3 views
3

다음 Postgres 쿼리를 실행합니다.두 문자열 사이의 거리 계산하기

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

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 자까지로, null 이외의 문자열이 될 수 있습니다. 비용 매개 변수는 문자 삽입, 삭제 또는 대체 각각 에 청구 할 요금을 지정합니다. 함수의 두 번째 버전에서와 같이 비용 매개 변수를 생략 할 수 있습니다. 그래서 1

에 경우 에서 모두 기본값은 기본 비용 매개 변수와 함께, 당신이 얻을 결과는 source에 당신이 (삽입, 삭제, 또는 치환)을 변경해야 할 문자의 총 수입니다 target을 얻으십시오.

백분율 차이를 계산해야하는 경우 levenshtein 함수 결과를 소스 텍스트 길이 (또는 목표 길이 - 백분율 차이 정의에 따라)로 나눠야합니다.