이승학 버즈니 서비스엔지니어링 팀장

▲ 이승학 버즈니 서비스엔지니어링 팀장

[컴퓨터월드] 많은 애플리케이션들은 서비스 사용성과 품질을 보장하기 위해 상당부분 ‘검색’ 기술에 의존하고 있다. 하지만 검색은 다양한 기술의 융·복합체로 쉽게 접근하기 어렵고 여러 가지 어려운 배경 지식을 필요로 한다.

이런 검색 기술의 접근성을 높이고 구현을 용이하게 해주는 솔루션들로는 아파치 루씬(Apache Lucene) 라이브러리에서 파생된 아파치 솔라(Apache Solr), 엘라스틱서치(Elasticsearch)등이 있다. 엘라스틱서치의 필수 구성 요소들을 통해 검색 엔진에 대한 이해도를 높이고 서비스로서의 활용 가능성과 효용 가치를 공유하고자 강좌(6회)를 신설했다. <편집자 주>

1. 엘라스틱서치 파이썬 클라이언트를 이용한 ‘검색’ 입문 (2018.9)
2. 엘라스틱서치로 검색엔진 전환하기 (2018.10)
3. 엘라스틱서치 활용(1): 자동완성 (이번호)
4. 엘라스틱서치 활용(2): 로그 시스템
5. 엘라스틱서치 단계별 최적화
6. 검색엔진 관리 자동화


검색 서비스를 구축할 때 사용자에게 좋은 경험을 제공하기 위해서는 다양한 가치를 추구하고 이를 제공할 수 있도록 해야 한다. 추상적으로 얘기하면 검색 서비스는 사용자가 원하는 바를 ‘잘 알고’, ‘정확’하고 ‘빠르게’ 정보를 제공해야 한다는 것이다. 이번 글을 통해 좋은 검색 서비스의 시작점인 ‘잘 알고’ 부분에 대해서 알아보도록 하자.

검색 서비스에서는 사용자의 의도를 잘 파악하기 위한 다양한 형태의 기능들이 있다. 그 중 최근 사용자들의 만족도가 높고 파생 형태로 활용하기 좋은 ‘검색어 자동완성’ 에 대해서 다뤄보도록 하겠다.

자동완성을 구현하는 기존 방법들을 간단히 살펴보면 굉장히 다채롭다는 것을 알 수 있다. RDB 기반의 like 구문을 활용하거나, NoSQL의 key-value 구조, 트리구조를 활용한 데몬, 형태소 분석기를 이용한 자연어 처리 등이 있다. 세부적인 내용에서 차이가 있지만 결국 이 방법들의 공통점은 입력된 단어의 연속성을 중요시 하고 있다는 점이다.

엘라스틱서치에서는 별도의 검색 API ‘Suggesters’를 통해 공식적으로 자동완성 기능을 제공하고 있다. 자동완성을 위한 맵핑 구조부터 인덱싱, 검색 과정을 직접 다뤄보면서 이해도를 높이고 응용 포인트를 확인해 보도록 하자.


# 자동완성 데이터 준비
자동완성에서 사용할 초성, 중성, 종성 형태의 검색어 그룹을 준비하기 위해서 유니코드를 사용해 글자를 분리하는 작업을 선행해 보자. 영문과 다르게 유니코드에서 한글은 초성, 중성, 종성을 구분하지 않고 완성된 형태의 단일 글자를 그대로 사용한다. 예를 들어 ‘남’이라는 글자를 ‘ㄴ’, ‘ㅏ’, ‘ㅁ’ 으로 나뉜 형태가 아닌 ‘남’으로 사용한다.

한글의 자음과 모음은 유니코드에서 44032(0xAC00) ~ 55203(0xD7A3) 사이에 존재한다. 총 11,712개의 한글이 실제로 코드 상에서 표현되는 방법은 초성 19개, 중성 21개, 종성 28개의 조합이다.

<한글 유니코드값 계산 방법>

한글유니코드 값 = (초성 * 21) + 중성) * 28 + 종성 + 44032
초성 = ((‘남' 유니코드 값 - 44032) / 28) / 21
중성 = ((‘남' 유니코드 값 - 44032) / 28) / 21
종성 = (‘남' 유니코드 값 - 44032) / 28
초성유니코드 값 = 초성 + 0x1100
중성유니코드 값 = 중성 + 0x1161
종성유니코드 값 = 종성 + 0x11AB -1

실제 코드를 통해 변환 과정을 살펴 보도록 하자.

▲ 한글의 초성, 중성, 종성 목록

입력된 글자가 한글의 유니코드 시작점인 ‘가’에서부터 종점인 ‘힣’까지의 유니코드 값을 범위로 도출, 588번마다 반복되는 초성을 시작으로 중성과 종성의 순서에 따라 대응되는 자소를 선택해 글자의 구성 결과를 확인한다.

▲ 한글의 자소 분리 예시

영문 타자로 타이핑된 한글에 대해서도 준비해보자. 한글의 영문자배열 타이핑으로의 변환은 키보드 배열을 그대로 이용하면 되기 때문에 변환 테이블만으로 손쉽게 가능하다. 단 본 예제에서는 키보드 입력 방식이 한글 2벌식인 경우에 한정한다.

▲ 한글-영문타이핑 변환 예시


# 자동완성 인덱스 준비
자동완성을 사용하기 위해서는 원본 필드와 자동완성이 동작할 필드를 함께 맵핑해 주는 것이 사용성 측면에서 용이하다. 자동완성 필드는 ‘completion’ 타입을 사용하게 되며, 추가로 analyzer, search_analyzer, preserve_separators, preserve_position_increments, max_input_length 등에 대한 값을 조정 가능하다. 본 예제에서는 별도의 형태소 분석기를 사용하지 않고 그대로 사용하기 위해 ‘whitespace’로 지정했으며, 그 외의 옵션에 대해서는 기본값과 동일하게 기재했다.

▲ 검색어 자동완성 인덱스 세팅


# 초성 자동완성
자동완성 대상 검색어를 인덱싱하기에 앞서, 본 예제에서는 형태소 분석기를 사용하지 않으므로 미리 분석된 검색어 묶음을 만드는 작업을 선행하도록 한다. 자동완성 대상 검색어는 필자가 담당하고 있는 모바일 홈쇼핑 포털 앱 ‘홈쇼핑모아’ 서비스에서 발생하는 검색어 일부를 추출해 사용했다.

▲ 한글 초성 타이핑 변환셋

초성 추출은 대상 검색어에 대해 아스키코드로 변환해 초성-중성-종성의 순서 규칙을 기반으로 필터링하는 방식을 사용했다. 추출 방식에 대해서는 각자가 익숙한 방식을 선택하면 되겠다.

▲ 한글 초성 변환 예시

초성-검색어로 이루어진 인덱싱이 끝나면 자동완성을 위한 준비는 모두 끝나게 된다.

▲ 초성-검색어 인덱싱

자동완성은 기존의 search API를 이용하는 것도 가능하지만, 자동완성만을 사용하는 경우라면 suggest에 필요한 질의만 작성해 간편하게 사용할 수 있는 suggest API를 추천한다. 본 글에서는 ‘prefix’ 또는 ‘text’를 통한 간단한 suggest 요청을 사용하도록 한다.

▲ 초성 검색 결과

검색 결과 인덱싱한 초성만으로 완성형의 검색어가 나오는 것을 확인할 수 있다. 하지만 이 정도의 내용으로는 자동완성으로서의 기능은 만족스러우나 확장성에는 아쉬운 면이 보인다. 이어서 초성, 한글의 영문 타자 등 혼합된 형태로 자동완성을 확장해보도록 하자.


# 혼합형 자동완성
자동완성 인덱스에 추가로 한글-영문타자, 음절 단위의 검색어 형태를 추가한다.

▲ 한글-영문타자, 음절, 초성 추출 예시

단일 형태가 아닌 혼합형으로 인덱싱을 진행할 때는 리스트 형식으로 진행하면 포함된 모든 경우에 대해 suggest를 수행해 준다.

▲ 혼합된 형태의 suggest 인덱싱

혼합된 형태의 자동완성은 지원하고자 하는 언어의 범위를 확장할 수 있고, 원하는 형태의 어순을 고려할 수도 있기 때문에 활용 범위가 크게 높아진다. 단순히 자동완성을 넘어 형태소 분석기와 조합을 통해 오-탈자 확인 등 사용자를 위한 정확한 검색어 제시가 가능하다.

▲ 혼합 형태의 자동완성 결과


# 자동완성을 위한 랭킹
앞서 초성과 혼합형 자동완성을 통해서 기능적으로 검색어 제시 또는 대체하는 방법에 대해서 알아보았다. 하지만 사용자가 정말 원하는 결과를 보장해줄 수 있느냐는 물음표로 남아있다. 이를 위해 가중치 또는 랭킹의 형태가 적용된 자동완성을 완성해보도록 하자.

랭킹을 적용하기 위해서는 단일이나 혼합형에 관계없이 개별적으로 ‘weight’를 부여해야 한다. 이를 통해 연관성 점수를 계산하고 추천 형태로 투영할 수 있다. 이해를 돕기 위해 준비된 대상 검색어마다 임의의 ‘weight’를 부여하고 인덱스를 새로 준비해 보자.

▲ 개별적으로 ‘weight’를 부여한 인덱싱 갱신

랭킹을 적용하면 사용자에게 제공하고자 하는 의도를 그대로 투영해 제공할 수 있다. 유의해야 할 점은 ‘weight’를 부여하는 형태가 검색대상의 형태와 마찬가지로 단일 혹은 혼합 형태에 따라서 일관적이거나 그렇지 않은 결과를 보여줄 수 있다는 것이다. 따라서 목적에 맞게 설계해 사용하는 것이 중요하다.

▲ ‘weight’를 통한 랭킹이 반영된 결과


# 마치며
자동완성은 큰 어려움 없이 엘라스틱서치를 통해 쉽게 구현하고 사용할 수 있다. 하지만 사용자를 위한 서비스로써 그 가치를 더하기 위해서는 운용 단계에서의 고려 사항들을 고려해볼 필요가 있다. 사용자 입력 검색어와 자동완성대상으로서 검색어의 지속적인 갱신과 인기도 또는 관심도 같은 사용자행동 데이터를 잘 활용 한다면 강력하게 사용할 수 있다.

이번 호에서는 언어처리나 별도의 분석 모델을 사용하지 않고도 자동완성을 구성할 수 있는 방법을 제시해 봤다. 언어 선택의 제한을 벗어나 형태소 분석기 성능과 관계없이 자동완성 본연의 기능을 살펴보기 위해서 적용하지 않았지만, 실제로 구축하고자 하는 서비스의 형태나 주 서비스 언어에 따라서 적절한 형태소 분석기를 꼭 경험해보길 바란다.

저작권자 © 아이티데일리 무단전재 및 재배포 금지