웹사이트를 돌아다니다보면 ㄱㄴㄷㄹ...순서로

뭔가를 필터 하는 기능이 가끔 있어요.

 

자음 ㄱ으로 시작하는 것에 대해서 나타내려면 어떻게 해야하지...고민을 하긴 개뿔 검색을 해보았죠.

내가 고민하고 생각하는건 이미 다 누군가가 만들어 놨을 테니까!!

 

그러다가 이 글을 보았어요.

https://blog.naver.com/PostView.nhn?blogId=tmondev&logNo=220918935030

 

ES플러그인 커스터마이징 (3)ㅎㅇㅇㅎ검색 대응하기

티몬의 자동완성ES플러그인 커스터마이징을 다루는 마지막 3부의 주제로 한글 검색에 필수적인 자모 분해...

blog.naver.com

와~ 너무 고마운거 있죠?

그리고 글 시작 부분에 아래와 같은 글도 있더라고요~. 넘흐 조하

(다 읽어보니 너무 유익해요! 저 같은 ES허접은 짱짱 유익해요!)

(1) 어떠한 검색어도 의미있는 추천을 
(2) 핫딜 검색순위 조절하기

[출처] ES플러그인 커스터마이징 (3)ㅎㅇㅇㅎ검색 대응하기|작성자 개발몬스터

 

결정적으로 초성검색이 가능한 플러그인을 만드는건데...

저는 초성검색이 가능하면 좋겠지만! 일단은 시작글자 초성기반 필터링을 목적으로 하는거라서요 ㅎㅎ(허접해)

그래서 고심끝에 아주 쉬운 방법으로 접근을...ㅎㅎ

목적 단어에서 시작 글자 초성을 뽑아내서 저장해서 걔로 필터링을 하면 되겠지 하고 생각을 했죠. 므흣.

import java.util.ArrayList;
import java.util.List;

public class ChosungTest {
	// 한글 소리 마디의 Unicode 시작 지점 (가)
	static char UNICODE_SYLLABLES_START_CODEPOINT = 0xAC00;
	
	// 한글의 Unicode 총 글자 수
	static int COUNT_IN_UNICODE = 11172;
	
	// 한글 중성의 Unicode 총 글자 수
	static int COUNT_JUNGSUNG_IN_UNICODE = 21;
	
	// 한글 종성의 Unicode 총 글자 수
	static int COUNT_JONGSUNG_IN_UNICODE = 28;
	
	// 한글 자모 분해의 계산 기본 값 (중성 글자 수 * 종성 글자 수)
	static int JAMO_SPLIT_VALUE = COUNT_JUNGSUNG_IN_UNICODE * COUNT_JONGSUNG_IN_UNICODE;

	protected final static char[] COMPATIBILITY_CHOSUNGs = {  
				            0x3131, 0x3132, 0x3134, 0x3137, 0x3138,     // ㄱ, ㄲ, ㄴ, ㄷ, ㄸ  
				            0x3139, 0x3141, 0x3142, 0x3143, 0x3145,     // ㄹ, ㅁ, ㅂ, ㅃ, ㅅ  
				            0x3146, 0x3147, 0x3148, 0x3149, 0x314A,     // ㅆ, ㅇ, ㅈ, ㅉ, ㅊ  
				            0x314B, 0x314C, 0x314D, 0x314E              // ㅋ, ㅌ, ㅍ, ㅎ  
				    };  
	
	public static char parse(String token) {
		char rtn = ' ';
		
		if(null == token) {
			return rtn;
		}
		
		token = token.trim();
		
		for (int i = 0, length = token.length(); i < length; i++) {
			char ch = token.charAt(i);
			
			// 이게 뭐하는거지 하고 보니까 한글 범위에 대한 값을 찾는 역할 이더라고요. 결과가 0~11172 사이의 값이 나오면 한글인거죠!
			char expectedKorean = (char) (ch - UNICODE_SYLLABLES_START_CODEPOINT);

			System.out.println(ch);
			System.out.println(expectedKorean);
			
			if (expectedKorean >= 0 && expectedKorean <= COUNT_IN_UNICODE) {  
				System.out.println("한글");
				
				int chosung = expectedKorean / JAMO_SPLIT_VALUE;
				
				System.out.println(COMPATIBILITY_CHOSUNGs[chosung]); 
				
				rtn = COMPATIBILITY_CHOSUNGs[chosung];
				break;
			}else {
				System.out.println("노한글");
				rtn = ch;
				break;
			}
		}
		return rtn;
	}
	
	public static void main(String[] args) {
		List<Character> ls = new ArrayList<>();
		
		ls.add(parse("한국"));
		ls.add(parse("korean"));
		ls.add(parse("韓國"));
		ls.add(parse("케이리그"));
		ls.add(parse("k리그"));
		ls.add(parse(""));
		
		System.out.println(ls);
        // 결과 : [ㅎ, k, 韓, ㅋ, k,  ]
	}

}

 

중간 중간 값이 궁금해서 출력문을 넣었어요.

그리고 ...중요한건 초성 분리 공식부분인데..

static int JAMO_SPLIT_VALUE = COUNT_JUNGSUNG_IN_UNICODE * COUNT_JONGSUNG_IN_UNICODE;
...
int chosung = expectedKorean / JAMO_SPLIT_VALUE;

이게 뭐하는거지~ 하고 잘 이해가 안갔어요.

그래서 글을 좀 찾아보았죠.

http://dream.ahboom.net/entry/%ED%95%9C%EA%B8%80-%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C-%EC%9E%90%EC%86%8C-%EB%B6%84%EB%A6%AC-%EB%B0%A9%EB%B2%95

 

IT 소시민의 소소한 이야기 :: 한글 유니코드 자소 분리 방법

한글 유니코드 자소 분리 방법 한글 유니코드 자소 분리하는 방법을 설명해 보겠습니다. 이제는 많이 알려진 방법이라 드문 내용은 아니지만 제가 알고 있는 지식을 정리하는 차원에서 정리해 봤습니다. 물론 완성된 코드만 사용하셨던 분이거나 처음 접하는 분이라면 이론적 배경을 아시게 될 겁니다. 언어는 자바스크립트를 사용하도록 하겠습니다. 자바스크립트의 문자열은 내부적으로 16비트 유니코드로 처리되고 있기 때문에 여기서 설명하는 원리를 바로 테스트 해 보기 좋습

dream.ahboom.net

이게 분리하는거부터 보면 이해가 어렵지만 위 포스팅 글 내용처럼 합치는걸 먼저 보니 아하! 하고 이해가 가더라고요!

대강 어떤 느낌인지 알았으니까 된거겠죠?

 

결과적으로 이렇게 나온 초성 첫글자 데이터를 저장해서 필터로 사용하면 문제가 안 될거 같아요!

굳이 뭐 ES가 아니어도 상관없는건데...검색기능도 만들어서 나중에 붙이려고 이렇게 하고 있네요.

 

그때는 위 링크들을 바탕으로 플러그인 만들어서 사용해야지~

 

도움주신분들 너무 감사합니다!

+ Recent posts