검색 서비스 기획 시리즈 첫번째 글에서 (1)검색어 입력, (2)자료 조회, (3)결과 전시의 세 단계로 검색 서비스를 나누며 전반의 FLOW를 정리했고, 그 후 첫번째 검색어 입력 단계의 UX를 분석했었습니다. 이어서 이번 글은 그 두번째 단계인 (2)자료 조회 과정의 UX를 분석해 보겠습니다.
자료 조회 단계는 유저가 화면에 검색어를 입력해 요청한 시점부터 검색된 결과를 다시 화면에 노출하기 전까지의 과정에 해당합니다. 따라서 프론트에 보이는 UX적 장치보다는 사실 백엔드의 기능이 주를 이룹니다. 그래서 이번 글은 유저가 요청한 검색어를 어떻게 쪼개고 분석해서 결과를 제공하는지, 그 검색 엔진 본연의 기능에 초점을 맞추어 케이스를 분석했습니다.
검색어를 입력하고 버튼을 누르면 검색 엔진은 요청된 쿼리를 잘 쪼개고 분석하고 확장한 후 미리 인덱싱된 DB에서 검색 결과를 조회합니다. 그런데 이때, 애초에 유저의 쿼리가 올바르지 않다면 어떨까요? 유저는 검색어를 실수로 잘못 입력할 수도 있고, 자신의 의도를 제대로 반영하지 못한 검색어를 사용할 수도 있는데요. 그에 따라 엉뚱한 검색 결과가 노출되거나, 그 결과가 너무 많거나 적어 충분한 탐색이 어려울 수 있습니다. 유저의 단순한 실수로 일부 결과가 노출되지 못할 수도 있지요. 이 단계의 목적은 기본적으로 검색 엔진을 통해 유저의 질의에 맞는 결과를 찾는 데 있지만, 이처럼 발생 가능한 케이스를 고려해 유저의 탐색 및 목적 달성과 그 과정에서의 편의를 도울 수 있어야 합니다.
유저의 질의가 애초에 올바르지 않다면 검색 엔진이 동작해도 원하는 결과를 얻을 수 없습니다. 서비스는 이처럼 실수로 오타를 내거나 잘못 입력한 경우를 돕기 위해 다양한 교정 기능을 제공합니다.
쿠팡과 무신사는 쿼리에 오탈자가 있을 경우 이를 교정해 주고, 결과 화면 최상단에 교정했다는 것을 알려줍니다. 이렇게 구현하려면 빈번하게 잘못 입력되는 오탈자 세트를 검색 사전으로 관리하고 있거나, 쿼리를 자소 기준으로 쪼개서 정확도를 비교해 줄 수도 있겠습니다. 다만 검색 사전을 관리하려면 지속적인 운영 리소스가 발생하는데 반해, 무신사가 '하하'를 '하드'로 교정해 준 결과로 미루어보면 후자의 방식에 좀 더 가까워 보입니다.
추가로, 쿠팡은 교정한 검색어로 검색한 후 원래의 검색어를 제안하는 반면, 무신사는 그 반대로 오탈자 그대로 검색한 후 수정된 검색어를 제안하는 방식의 차이가 있습니다.
올리브영 또한 오탈자를 교정해서 결과를 보여줍니다. 이때 별다른 안내는 없는데요. 만일 처음 입력했던 검색어가 오탈자가 아닌 실제 상품명이라면 유저가 원하는 상품을 찾을 수 없는 치명적인 구멍이 될 수 있습니다. 그러니 애초에 오탈자를 교정해서 검색했다기보다는, 유저의 쿼리대로 검색한 후 (마지막에 소개할) 검색어 확장의 방식으로 결과를 추가하는 방식일 수 있습니다.
네이버는 '영양제'를 영타로 입력하면 자동으로 한글로 변환해 줍니다. 키패드 언어 설정이 잘못되면 자주 실수할 수 있는 상황인데요. 흔하지 않은 단어도 교정해 주므로 별도의 사전 관리 없이 입력된 검색어를 자소단위로 분석해서 변환해 주는 것으로 보입니다. 또한 그렇기 때문에 '모른ㅁㄹ' 처럼 성립할 수 없는 단어가 영타로 입력되면 교정하지 않습니다.
당근은 오탈자 교정 기능이 없거나 활발하지 않은 것으로 보입니다. 다만, '자정거'로 검색했을 때 결과가 나오는 것처럼, 중고거래 특성상 실제 등록된 상품 데이터에 오탈자가 포함될 수 있어 신중한 접근이 필요한데요. 서비스 특성을 고려하더라도 오탈자 교정이 없다면 검색결과가 적거나 아예 없어 재현율이 낮은 문제가 있습니다. 개인적으로는 유사어 확장 등으로 검색 대상을 넓히고 정밀도 높은 상품을 우선 정렬하는 방식으로 유저의 실수를 보완함으로써 검색 성공률과 만족도를 높이는 방법도 적절해 보입니다.
형태소 분석은 유저의 쿼리를 분석하는 과정입니다. 입력된 검색어는 먼저 분절(tokenize)하는 과정을 거칩니다. 분절한 후에는 대소문자 정리, 정렬 등의 전처리 과정과 불용어 제거, 어말어미, 품사 정리 등 본격적인 형태소 분석의 과정을 거쳐 최종적으로 검색을 수행할 용어(terms)를 추출합니다. 이렇게 추출한 용어를 바탕으로 동의어, 유사어 처리 후 확장된 용어 풀과 함께 인덱싱 해둔 자료를 조회하고, 그 검색 결과를 보여주는 것이 전반적인 검색 과정입니다.
형태소 분석이 적절하게 수행되지 않으면 엉뚱한 검색 결과가 노출되거나, 결과가 없을 수도 있습니다. 또한, 입력한 검색어를 분절(tokenize)할 때에는 의미, 단어, 띄어쓰기 등 다양한 기준을 채택할 수 있는데요. 그에 따라 전혀 다른 검색 결과가 보일 수도 있습니다. 이번에는 서비스별로 형태소 분석 방법에 어떤 차이가 있을지 간단하게 보겠습니다.
29CM에서 흰색 니트를 검색해 보겠습니다. '하얀 니트'로 띄어쓰기하면 '하얀', '니트'로 각각 분절된 후 형태소 분석을 거쳐 '하얀색' 속성의 '니트' 상품이 검색됩니다. 반면 '하 얀 니트'로 중간에 띄어쓰기를 한번 더 하면 '하', '얀', '니트'로 분절되어 하얀색 속성이 분석되지 못했고, 그 결과로 엉뚱한 검색 결과가 노출되었습니다. 이로 미루어보아 29CM는 우선적으로 띄어쓰기 기준으로 텀분절하는 것으로 보입니다.
당근, 퀸잇도 마찬가지입니다. '반지갑'으로 검색하면 형태소 분석 후 반지갑 관련 결과를 보여주지만, '반지 갑'으로 띄어쓰기하면 관련 결과를 보여주지 않습니다. 한편, 당근에서는 '반지'로만 검색하면 관련 결과가 나오는데도 '반지 갑'으로 검색하면 나오지 않고 있어, 띄어쓰기로 텀분절 후 두 단어의 정확도를 모두 고려해 결과를 구성하는 것으로 보입니다. 퀸잇은 띄어쓰기했을 추천 상품 영역에는 반지갑이 노출되나, 검색 결과 영역에는 반지 관련 상품만 보여 서로 조회하는 알고리즘이 다른 것으로 보입니다.
사실 반지갑을 찾는 고객이 띄어쓰기 실수로 원하는 상품을 결국 찾지 못할 가능성은 낮을 것 같습니다. 특히 커머스는 검색 대상이 상품으로 한정되어 있으므로, 상품명이나 브랜드 사이에만 띄어쓰기가 사용될 것이고 따라서 이를 기준으로 텀분절한 배경을 이해할 수 있습니다. 또한, 띄어쓰기 실수는 비교적 고객이 알아채기 쉬우므로 원하는 검색 결과를 받지 못했을 때 교정하기 쉬운 반면, 띄어쓰기가 아닌 다른 방법으로 의미 단위의 형태소 분석 엔진을 구축하기 위해서는 리소스가 높은 점도 고려해야 할 것 같습니다.
네이버는 다른 분석 방법을 사용하는 것으로 보입니다. '반지갑'과 '반지 갑'을 검색해도 결과는 동일하게 반지갑을 보여줍니다. 한발 더 더 나아가서, '반지 갑'을 검색했을 땐 반지 관련 결과는 거의 나오지 않습니다. 반면 '반지 갑 면'처럼 뒤에 아무 글자를 덧붙이면 반지와 관련한 게시글이 검색됩니다. 이로 미루어보아 네이버는 유저가 입력한 검색어에서 띄어쓰기를 제거하고 Ngram 등으로 텀분절을 수행한 후, 질의한 의도를 고려해 형태소 분석을 수행하는 것으로 보입니다. 따라서 '반지 갑 면'을 검색하면 반지갑을 의도했을 가능성은 낮게 판단되고 반지와 기타 의도가 상대적으로 높게 분석되면서 일치하는 검색 결과가 반환됩니다.
번외로 형태소 분석은 이번 글에서 소개한 것처럼 입력된 검색어를 분석하는 과정에도 사용되지만, 서비스에 저장된 상품이나 자료 같은 검색 대상을 미리 가공해 검색 효율을 높이도록 인덱싱(Indexing)하는 과정에서도 사용됩니다. 다음 글에서는 검색 성능에 깊게 관여하는 인덱싱에 대해서도 정리해 보겠습니다.
단순한 타이핑 실수 외에도 검색어가 대상을 조회하기에 적절하지 못한 값이라면 어떨까요? 유저가 찾는 것을 정밀하게 타겟팅하지 못하는 검색어를 선택한 경우 원하는 결과가 나오지 않을 수 있고, 그 결과의 양이 충분하지 못하거나 아예 없을 수도 있습니다. 뿐만 아니라 유저가 선택한 검색어가 어느 정도 결과를 확보하고 있더라도, 이면에 숨겨진 의도와 맥락을 파악해서 충분한 결과를 보여줄 때 더 만족도 높은 탐색을 제공할 수 있습니다. 따라서 서비스에서는 입력한 검색어를 분석한 후 그 의미를 파악해 검색어를 확장하게 됩니다.
크림에서 검색어를 입력하면 상품명, 브랜드명, 카테고리명 등을 인덱싱 한 DB를 주로 조회하게 될 겁니다. 그에 앞서 유사어 확장을 수행하는데요. '잠바'와 같이 일상에서 사용하는 구어체로 검색해도 '자켓' 카테고리와 유사어 처리가 되어 유저가 원하는 검색 결과를 반환해 줍니다.
단, 이 단계는 검색 결과를 풍부하게 제공하는 데 목적이 있으므로, 오탈자 교정과 다르게 입력한 검색어의 대체가 아닌 추가하는 방식입니다. 잠바가 아닌 '점퍼'로 검색할 땐 유사어 확장 처리는 물론 상품명에 jumper가 포함된 상품을 (유사어 처리된) 카테고리 자켓인 상품과 함께 검색되는데요. 검색된 상품의 카테고리 또한 가디건부터 후드, 셔츠, 원피스에 이르기까지 다양해 유저가 보다 넓게 탐색할 수 있습니다.
줄임말 또한 확장 대상에 포함합니다. 크림에서 '바막'을 검색하면 '바람막이'로 유사어 처리해 함께 검색하며, 따라서 '바람막이'를 검색한 결과와 거의 동일합니다. 유사어, 줄임말 확장은 기능적으로 처리하기보다는 실제 유저가 사용하는 맥락과 행태를 이해한 후 제공해야 하므로 오탈자 교정과는 다르게 주로 검색 사전을 통해 제공될 것 같습니다.
유사어 확장 대상에는 외래어도 포함될 수 있습니다. 29CM에서 '드라이어'로 검색하면 동의어로 사용되는 '드라이기'로 대상을 확장합니다. 네이버에서 '초코릿'으로 외래어 표기법에 맞지 않는 단어로 검색하더라도 검색 대상을 확장해 제공함을 알 수 있습니다.
단순히 유사어 확장에서 한발 더 나아가, 네이버는 대체어로 확장하는 기능을 제공합니다. 예를 들어 '판교 메가박스'로 검색하면 '판교 CGV', '판교 현대백화점' 등으로 대체 검색어를 제안합니다. 사실 판교(역) 근처에는 메가박스가 없는데요. 메가박스를 '영화관'으로 분류해 유저가 찾는 의도를 파악한 후 비슷한 맥락을 추천해 검색 편의를 높이는 세심한 기능입니다.
네이버의 대체어 기능은 사실 검색 대상을 이미 확장해 결과를 제공하기보다는 유저가 입력한 검색어 내에서 결과를 조회한 후 추가로 제안하는 방식이므로 유사어 확장보다는 연관검색어 기능에 더 가까울 수 있습니다. 연관 검색어 기능은 다음에 소개할 검색 FLOW 중 (3)결과 전시 단계에서 더 자세하게 살펴보겠습니다.
지금까지 들여다 본 (2) 자료 조회 단계는 검색 엔진이 실제로 수행되는 백엔드의 동작이 대부분입니다. 따라서 형태소 분석을 필두로 오탈자 교정, 유사어 확장 등은 검색 성능을 좌우하는 중요한 파트이며, 이 기능에 문제가 있다면 유저가 원하는 검색 결과를 정밀하게 제공하지 못하고 엉뚱한 결과가 반환되거나, 같은 의미의 다른 표현으로 검색했을 때 서로 다른 결과를 제공하거나, 단순한 띄어쓰기 차이 등으로 일부 결과가 노출되지 못할 수도 있지요. 만일 이런 상황이 발생한다면 검색 결과가 없거나 지나치게 적어 검색 실패율이 증가하거나, 검색 결과에서 유저가 클릭해서 추가 탐색한 대상이 없어 클릭률이 낮아지거나, 검색 후 구매로 이어지는 전환율이 떨어질 수 있습니다.
마지막 대체어 사례에서도 언급했듯, 유저의 검색어가 적절하지 못했거나 충분한 결과를 보여줄 수 없는 문제에 대해서는 연관검색어 같은 부가적인 기능으로 보완하기도 합니다. 다만, 이번 글에서는 검색 엔진의 기본적인 동작을 중심으로 한정해 들여다 보았으므로, 다음 글에서는 이렇게 조회한 결과를 유저에게 전달하며 제공하는 프론트 중심의 다양한 UX 케이스를 분석해 보겠습니다.