자바 예제: 한글 검색 SQL 만들기 (자음 초성 검색 포함)
한글 유니코드와 관련된 내용은 이 글을 참고하세요: Java 예제: 한글 초성 중성 종성 분리 (자모분리)
만들고자 하는 SQL(mariadb)은 다음과 같습니다.
1
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을 입력하면 가 부터 시작하는 초성이 ㄱ로 된 모든 단어를 보여줍니다. '가' 대신 'ㄱ'을 넣어도 정상 동작합니다.
다음과 같은 경우가 있습니다.
- ㄱ를 입력한 경우 범위는 ㄱ … 깋
- 가글을 입력한 경우 범위는 가글 … 가깋
- 삼겹살을 입력한 경우 범위는 삼겹살 … 삼겹싷
- 지나가는ㅁ을 입력한 경우 범위는 지나가는ㅁ … 지나가는밓
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
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);
}
}
}
아래는 테스트 결과입니다.
This post is licensed under
CC BY 4.0
by the author.




