웹사이트를 돌아다니다보면 ㄱㄴㄷㄹ...순서로
뭔가를 필터 하는 기능이 가끔 있어요.
자음 ㄱ으로 시작하는 것에 대해서 나타내려면 어떻게 해야하지...고민을 하긴 개뿔 검색을 해보았죠.
내가 고민하고 생각하는건 이미 다 누군가가 만들어 놨을 테니까!!
그러다가 이 글을 보았어요.
https://blog.naver.com/PostView.nhn?blogId=tmondev&logNo=220918935030
와~ 너무 고마운거 있죠?
그리고 글 시작 부분에 아래와 같은 글도 있더라고요~. 넘흐 조하
(다 읽어보니 너무 유익해요! 저 같은 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;
이게 뭐하는거지~ 하고 잘 이해가 안갔어요.
그래서 글을 좀 찾아보았죠.
이게 분리하는거부터 보면 이해가 어렵지만 위 포스팅 글 내용처럼 합치는걸 먼저 보니 아하! 하고 이해가 가더라고요!
대강 어떤 느낌인지 알았으니까 된거겠죠?
결과적으로 이렇게 나온 초성 첫글자 데이터를 저장해서 필터로 사용하면 문제가 안 될거 같아요!
굳이 뭐 ES가 아니어도 상관없는건데...검색기능도 만들어서 나중에 붙이려고 이렇게 하고 있네요.
그때는 위 링크들을 바탕으로 플러그인 만들어서 사용해야지~
도움주신분들 너무 감사합니다!
'서버 > ES' 카테고리의 다른 글
[ElasticSearch] Nori - Index 생성 (0) | 2019.04.26 |
---|---|
[ELK] Tomcat Log 적재 ... 그리고 curator (0) | 2019.04.25 |
[ElasticSearch - Kibana] 설치 For Ubuntu (0) | 2019.04.12 |
[ElasticSearch] Nori와 설치 For Ubuntu (0) | 2019.04.09 |
[ElasticSearch] 설치 및 은전한닢(ev 6.1.4, pv 6.1.1.1) for Ubuntu (0) | 2019.04.05 |