한글 유니코드와 관련된 내용은 이 글을 참고하세요: Java 예제: 한글 초성 중성 종성 분리 (자모분리)

 

만들고자 하는 SQL(mariadb)은 다음과 같습니다.
SELECT `id`, `keyword`, `date`, count(keyword) as kcount FROM `recent_search_keyword` WHERE keyword >= '가' and keyword <= '깋' group by keyword order by keyword

자바(또는 Spring)에서 입력된 키워드를 분석해서 위 SQL의 '가' '깋' 이 부분에 넣을 단어를 추출하는 예제입니다. 위 SQL을 입력하면 부터 시작하는 초성이 로 된 모든 단어를 보여줍니다. '가' 대신 'ㄱ'을 넣어도 정상 동작합니다.

다음과 같은 경우가 있습니다.

  • ㄱ를 입력한 경우 범위는 ㄱ …
  • 가글을 입력한 경우 범위는 가글 … 가
  • 삼겹살을 입력한 경우 범위는 삼겹살 … 삼겹
  • 지나가는ㅁ을 입력한 경우 범위는 지나가는ㅁ … 지나가는
package blog;

import java.util.Scanner;

public class SearchHangeul {
  public static void main(String[] args) {
  
    String text = "가깋낗닣딯띻맇밓빟삫싷잏짛찧칳킿팋핗힣";
    String jamoRef = "ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅇㅈㅉㅊㅋㅌㅍㅎ";
    
    char[] textArr = text.toCharArray();
    char[] jamoArr = jamoRef.toCharArray();
    
    try(Scanner s = new Scanner(System.in);) {
      
      System.out.print("입력하세요 >> ");
      String keyword = s.nextLine();

      char targetChar = keyword.charAt(keyword.length() - 1);
      // System.out.println((int) targetChar);

      char endChar = '0';
      
      // 입력값의 끝 문자가 ㄱ...ㅎ 인 경우
      if(targetChar <= 12622) {
        for(int i = 0; i < jamoArr.length; i++) {
          if(targetChar == jamoArr[i]) {
            System.out.println(targetChar + " to the end: " + textArr[i + 1]);
            endChar = textArr[i + 1];
          }
        }
      } else {
        // 입력값의 끝 문자가 가...힣 인 경우
        for(int i = 0; i < text.length(); i++) {
          System.out.println(textArr[i] + " : " + (int) textArr[i]);
          if(targetChar >= textArr[i] && targetChar < textArr[i + 1]) {
            System.out.println(targetChar + " to the end: " + textArr[i + 1]);
            endChar = textArr[i + 1];
          }
        }
      }
      // SQL 끝 단어
      String endKeyword = keyword.substring(0, keyword.length() - 1) + endChar;
      String outSql = "SELECT `id`, `keyword`, `date`, count(keyword) as kcount "
          + "FROM `recent_search_keyword` "
          + "\n\t\t"
          + "WHERE keyword >= '{start}' and keyword <= '{end}' "
          + "group by keyword order by keyword";
      outSql = outSql.replace("{start}", keyword).replace("{end}", endKeyword);
      System.out.println("**final SQL : " + outSql);

    }

  }
}

 

아래는 테스트 결과입니다.

 

문의 | 코멘트 또는 yoonbumtae@gmail.com




0개의 댓글

답글 남기기

Avatar placeholder

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다