Elastic Search

Ch07. 한글 검색 확장 기능 - 자바카페 플러그인

webmaster 2025. 9. 28. 02:02
728x90

한글 유니코드의 이해

현대의 문자 표현은 모두 유니코드로 이뤄지며, 전 세계의 문자를 모두 표현하기 위한 영역 중 한글은 0x0000 ~ 0xFFFF 영역으로 표현한다.

 

한글을 표현하는 유니코드 범위

한글 자모를 표현하는 유니코드

  • Hangul Jamo와 Hangul Compatibility Jamo에 정의
  • 한글 자모는 유니코드 0x1100 ~ 0x11FF까지의 범위를 가지며 총 256자로 구성된다.
  • 한글 호환용 자모는 유니코드 0x3130 ~ 0x318F까지의 범위를 가지며, 총 96개의 공간 중 94자를 정의해서 구성된다.
  • 현대 한글 체계에서는 초성 19자, 중성 21자, 종성 28자로 분류

한글 음절을 표현하는 유니코드

  • 음절은 한글 자모에서 제공하는 초성, 중성, 종성으로 이뤄진 한글 한 글자를 표현하는 단위를 의미한다.
  • 모든 글자는 Hangul Syllables에 코드로 정의되어 있다
  • 한글 음절 유니코드는 0xAC00 ~ 0xD7AF까지의 범위를 가지며 11184 공간 중 11172자를 정의해서 구성

한글 자모 분석 필터

자모 분석 과정

@Test
public void jamoTest1() {
    String token = "자바카페";
    KoreanJamoParser parser = new KoreanJamoParser();

    String result = parser.parse(token);

    // 기대하는 자모 분해 결과 (예시)
    assertEquals("ㅈㅏㅂㅏㅋㅏㅍㅔ", result);
}

@Test
public void jamoTest2() {
    String token = "성천자";
    KoreanJamoParser parser = new KoreanJamoParser();

    String result = parser.parse(token);
    System.out.println(result);

    // 기대하는 자모 분해 결과 (예시)
    assertEquals("ㅅㅓㅇㅊㅓㄴㅈㅏ", result);
}
  • javacafe_jamo 필터는 한글을 자모 단위로 분해해서 제공하는 분석 필터이다.
    • 토크나이저에 의해 텀으로 분리된 단어를 글자수 별로 파싱해서 자모 분석을 하며, 처리할 글자가 한글 유니코드에 해당하지 않을 경우에는 분해하지 않고 무시한다.
  • 필터는 글자의 한글 음절 유니코드를 확인해 이에 매칭되는 한글 자모 유니코드를 추출한다.
  • 색인용 분석기로는 jamo_index_analyzer를 정의하고, 검색용 분석기로는 jamo_search_analyzer를 정의했는데, 색인 시 edgeNgram 필터가 추가되어야 하다.
    • 색인할 때와 검색할 때 토큰을 분리하는 기준이 다르기 때문
    • 자모 검색은 자동완성 형태의 검색에 많이 이용되기 때문에 단어가 키보드로 한 글자씩 입력되는 과정에서도 입력 순서에 따라 항상 자모 분석 결과를 제공해야 하기 때문이다.

한글 초성 분석 필터

@Test
public void chosungTest1() {
    String token = "자바카페";
    KoreanChosungParser parser = new KoreanChosungParser();

    String result = parser.parse(token);
    System.out.println(result);

    // 자바카페 → 초성: ㅈ ㅂ ㅋ ㅍ
    assertEquals("ㅈㅂㅋㅍ", result);
}

@Test
public void chosungTest2() {
    String token = "저자";
    KoreanChosungParser parser = new KoreanChosungParser();

    String result = parser.parse(token);
    System.out.println(result);

    // 저자 → 초성: ㅈ ㅈ
    assertEquals("ㅈㅈ", result);
}
  • javacafe_chosung 필터는 한글을 자모 단위로 분해 후, 초성만 추출해서 제공하는 분석 필터이다.
  • 색인용 분석기로 chosumg_index_analyzer를 정의, 검색용 분석기로는 chosung_search_analyzer를 정의
    • 색인용 분석기에 edge_ngram_filter_front 필터를 추가해야한다.
    • 마찬가지로 입력한 키에 모두 대응하기 위해 색인 시 edgeNgram을 추가적으로 적용해야 한다

영한 오타 변환 필터

@Test
public void test() {
    String token = "wkakzkvp";  // 두벌식 기준 "자바카페"
    EngToKorConverter convert = new EngToKorConverter();

    String result = convert.convert(token);
    System.out.println(result);

    assertEquals("자바카페", result);
}

@Test
public void test1() {
    String token = "tkatjdwjswk";  // 두벌식 기준 "삼성전자"
    EngToKorConverter convert = new EngToKorConverter();

    String result = convert.convert(token);
    System.out.println(result);

    assertEquals("삼성전자", result);
}
  • javacafe_eng2kor 필터는 한영 키에 의한 영문 오타를 한글로 교정해 주는 필터다.
  • 한글 키보드에 대응되는 영문 키보드 값을 정의해서 서로 변환해 주는 방식으로 구현되어 있다

한영 오타 변환 필터

@Test
public void testKorToEng() {
    String token = "자바카페";   // 한글 입력
    KorToEngConverter convert = new KorToEngConverter();

    String result = convert.convert(token);
    System.out.println(result);

    // 두벌식 기준: "자바카페" → "wkakzkvp"
    assertEquals("wkakzkvp", result);
}
  • javacafe_kor2eng 필터는 한글 오타를 영문으로 교정해 주는 필터이다.
  • 영어 키보드에 대응되는 한글 키보드 값을 정의해서 서로 변환해 주는 방식으로 구현되어 있다

스펠링 체크 필터

@Test
public void spellTest() {
    String token = "자바카페";
    KoreanJamoParser parser = new KoreanJamoParser();
    String result = parser.parse(token);
    
    assertEquals("ㅈㅏㅂㅏㅋㅏㅍㅔ", result);
}
  • 맞춤법 검사기 내부에서 사용하는 필터이다.
  • 맞춤법 검사를 위해서는 한글을 먼저 자모 형태로 분리해야 하기 때문에 이런 필터가 필요하며, javacafe_jamo 필터와 동일한 기능을 수행한다.
728x90