[Oracle] 한글 처리하는 초성 검색 기능 구현하기

궁금하면 500원·2024년 12월 22일

데이터 저장하기

목록 보기
12/29

최근 웹사이트나 애플리케이션에서 한글 초성 검색 기능을 제공하는 경우가 많습니다.

예를 들어, 사용자가 입력한 검색어에 대해 초성으로 검색을 하여 더 정확한 결과를 제공하는 기능이 있습니다.

이번 포스팅에서는 오라클 데이터베이스에서 한글 초성 검색 기능을 어떻게 구현할 수 있는지에 대해
지난 번에는 Java 컬렉션에 저장된 문자열들을 초성 검색하는 코드를 작성해보았습니다.

그런데, 문득 오라클 데이터베이스에 저장된 문자열들을 초성으로 검색하려면 어떻게 해야되는지 궁금해 졌습니다.

그래서 한번 구현해봤습니다.

데이터베이스에 다음과 같이 구성하였습니다.

CREATE TABLE words (
    no NUMBER(5) PRIMARY KEY,
    word VARCHAR2(100)
);

INSERT INTO words VALUES(1, '동해물과');
INSERT INTO words VALUES(2, '백두산이');
INSERT INTO words VALUES(3, '마르고');
INSERT INTO words VALUES(4, '닳도록');
INSERT INTO words VALUES(5, '하느님이');
INSERT INTO words VALUES(6, '보우하사');
INSERT INTO words VALUES(7, '우리나라');
INSERT INTO words VALUES(8, '만세');
INSERT INTO words VALUES(9, '무궁화');
INSERT INTO words VALUES(10, '삼천리');
INSERT INTO words VALUES(11, '화려강산');
INSERT INTO words VALUES(12, '대한사람');
INSERT INTO words VALUES(13, '대한으로');
INSERT INTO words VALUES(14, '길이');
INSERT INTO words VALUES(15, '보전하세');
INSERT INTO words VALUES(16, 'BOOK');

COMMIT;

1. 오라클 버전의 초성 검색 기능

오라클에서는 MySQL과는 다르게 PL/SQL을 사용하여 함수를 작성합니다.

초성 검색을 위한 함수를 만들기 위해서는, 한글의 초성을 추출하는 논리를 PL/SQL로 구현해야 합니다.

주어진 내용을 기반으로 오라클에 맞는 초성 검색 함수를 작성해 보겠습니다.

CREATE OR REPLACE FUNCTION CHOSUNGSTR(p_word IN VARCHAR2) 
RETURN VARCHAR2 
IS
    result VARCHAR2(4000) := '';
    ch CHAR(1);
    uc NUMBER;
    dec NUMBER;
    chosung CHAR(1);
BEGIN
    FOR i IN 1..LENGTH(p_word) LOOP
        ch := SUBSTR(p_word, i, 1);
        uc := ASCII(ch); -- 유니코드값을 가져오는 함수는 오라클에서 ASCII
        dec := uc; -- 유니코드 변환 및 초성 매칭

        -- 초성 매칭 (유니코드 값 기준)
        IF dec >= 44032 AND dec <= 44619 THEN
            chosung := 'ㄱ';
        ELSIF dec >= 44620 AND dec <= 45207 THEN
            chosung := 'ㄲ';
        ELSIF dec >= 45208 AND dec <= 45795 THEN
            chosung := 'ㄴ';
        ELSIF dec >= 45796 AND dec <= 46383 THEN
            chosung := 'ㄷ';
        ELSIF dec >= 46384 AND dec <= 46971 THEN
            chosung := 'ㄸ';
        ELSIF dec >= 46972 AND dec <= 47559 THEN
            chosung := 'ㄹ';
        ELSIF dec >= 47560 AND dec <= 48147 THEN
            chosung := 'ㅁ';
        ELSIF dec >= 48148 AND dec <= 48735 THEN
            chosung := 'ㅂ';
        ELSIF dec >= 48736 AND dec <= 49323 THEN
            chosung := 'ㅃ';
        ELSIF dec >= 49324 AND dec <= 49911 THEN
            chosung := 'ㅅ';
        ELSIF dec >= 49912 AND dec <= 50499 THEN
            chosung := 'ㅆ';
        ELSIF dec >= 50500 AND dec <= 51087 THEN
            chosung := 'ㅇ';
        ELSIF dec >= 51088 AND dec <= 51675 THEN
            chosung := 'ㅈ';
        ELSIF dec >= 51676 AND dec <= 52263 THEN
            chosung := 'ㅉ';
        ELSIF dec >= 52264 AND dec <= 52851 THEN
            chosung := 'ㅊ';
        ELSIF dec >= 52852 AND dec <= 53439 THEN
            chosung := 'ㅋ';
        ELSIF dec >= 53440 AND dec <= 54027 THEN
            chosung := 'ㅌ';
        ELSIF dec >= 54028 AND dec <= 54615 THEN
            chosung := 'ㅍ';
        ELSIF dec >= 54616 AND dec <= 55203 THEN
            chosung := 'ㅎ';
        ELSE
            chosung := ch;
        END IF;

        result := result || chosung;
    END LOOP;

    RETURN result;
END;

2. PL/SQL 코드 설명

  • LENGTH(p_word): 문자열의 길이를 구하여 반복문을 실행합니다.
  • SUBSTR(p_word, i, 1): 문자열에서 한 문자를 추출합니다.
  • ASCII(ch): 한 문자의 유니코드 값을 가져옵니다.
  • IF 구문: 유니코드 값에 따라 초성을 결정합니다.

3. 사용법

사용 예시

오라클에서는 함수를 호출하는 방법이 MySQL과는 다릅니다.
위에서 작성한 CHOSUNGSTR 함수는 다음과 같이 사용할 수 있습니다.

SELECT CHOSUNGSTR('한글') FROM DUAL; 

1. 한글 초성 이해하기

한글은 초성, 중성, 종성으로 이루어져 있습니다.

예를 들어 '한'이라는 글자는 초성 'ㅎ', 중성 'ㅏ', 종성 'ㄴ'으로 구성되어 있습니다.

이 초성을 이용하여 검색할 때 검색 성능을 최적화하고 사용자에게 편리한 검색 경험을 제공할 수 있습니다.

위 쿼리를 실행하면 'ㅎㄱ'이 반환됩니다. 한글 문자열 '한글'의 초성만 추출한 결과입니다.

  1. 입력: '안녕하세요'
    • 출력: 'ㅇㄴㅎㅅㅇ'
  2. 입력: '개발자'
    • 출력: 'ㄱㅂㅈ'
      이와 같이 한글 문자열을 초성으로 변환할 수 있습니다.

2. 초성 추출 함수 작성

  • 초성을 추출하려면 각 한글 문자가 가진 유니코드 값을 활용해야 합니다.
  • 한글의 유니코드는 44032부터 시작하여 순차적으로 증가합니다.
  • 이를 바탕으로 한글 초성을 추출하는 방법을 PL/SQL로 구현할 수 있습니다.
  • 오라클에서 이를 구현하기 위해 CHOSUNGSTR라는 함수를 작성하였습니다.
  • 이 함수는 주어진 문자열을 순차적으로 처리하여 각 문자에 대해 초성을 추출하고, 그 초성만을 반환합니다.

응용 및 실전 코드

  • 초성 검색 기능은 사용자의 편의를 위한 기능으로, 예를 들어 한글 이름이나 상품명에 대해 초성으로 검색할 수 있습니다.

  • 검색 시스템에서 이 기능을 어떻게 활용할 수 있을지에 대한 응용 예시도 다루면 좋습니다.

  • 예를 들어, '홍길동'이라는 이름을 초성으로 검색하려면, 사용자가 'ㅎㄱㄷ'을 입력하면 '홍길동'을 찾을 수 있게 됩니다.
    이를 통해 검색 효율성을 높이고 사용자 경험을 개선할 수 있습니다.

결론

이번 포스팅에서는 오라클에서 한글 초성 검색 기능을 구현하는 방법에 대해 다뤄보았습니다.

초성 검색 기능은 한국어 기반 시스템에서 매우 유용하게 사용될 수 있으며, 검색 기능을 최적화하는 데 큰 도움이 될 수 있습니다.

오라클과 같은 데이터베이스에서는 PL/SQL을 활용하여 효율적으로 처리할 수 있습니다.

참고자료

profile
공부할게 많아졌어요

0개의 댓글