Elasticsearch를 이용한 검색 시스템 개선 여정
안녕하세요, 아임웹 검색 시스템 개발과 CRM 개발을 담당하고 있는 백엔드 엔지니어 김가을입니다.
아임웹이 점점 더 성장함에 따라 구성원은 각자의 자리에서 고객 경험 향상을 위해 노력하고 있는데요. 빠른 검색 속도 역시 고객에게 제공되어야 할 중요한 부분입니다. 이를 위해 기존 Elasticsearch의 시스템을 개선해 더욱 빠르고 정확한 검색 경험을 제공했습니다. 시스템 개선 과정과 이러한 개선이 어떻게 전체 시스템의 성능에 영향을 미쳤는지 소개하려고 합니다.
소개에 앞서 아임웹의 검색 시스템은 Elastic Stack으로 구성되어 있습니다.
Elastic 스택은 아래의 기술로 구성된 스택을 의미합니다.
- Elasticsearch
- Logstash
- Kibana
- Beats
Elasticsearch는 역 인덱스 (Inverted Index) 구조를 가지고 근 실시간 (Near Real-Time)대용량 검색 및 분석이 가능한 엔진입니다.
아임웹은 브랜드 빌더로서 다양한 상품을 판매할 수 있는 기능을 제공합니다.
고객들이 상품을 검색할 때, 전체 상품명을 입력하는 경우도 있지만 대부분은 일부 단어만을 사용하여 검색합니다. 기존 시스템에서는 검색 키워드가 주어지면 상품명, 상품 요약 설명, 상품 내용을 포함하는 문서를 찾기 위해 와일드카드 (wildcard)검색을 수행했습니다.
Elasticsearch의 와일드 카드 검색은 RDBMS 의
name like ‘%keyword%’
와 같습니다.
와일드카드의 문제가 맞는지 확인을 해보기 위해 해당 부분을 제거를 하고 조회를 해봤습니다. 검색 시간이 3초에서 0.14초로 대폭 감소하였습니다.
이 결과는 와일드카드를 제거하고 다른 방식을 도입하면 더 효율적인 검색이 가능하다는 가정을 뒷받침합니다.
와일드카드 검색은 문서를
Full Scan
을 필요로 하는 방식으로, 문서 수가 증가함에 따라 효율성이 저하되는 문제를 안고 있었습니다.
검색 딜레마
기존의 검색은 와일드카드와 함께 Nori Analyzer (Nori 한글 형태소 분석기), Standard Analyzer를 결합하여 검색 기능을 제공을 했습니다.
만약 속도를 위해서 와일드카드 검색을 제거하게 된다면 사용자들의 다양한 검색 요구를 충족시키기에 Nori
와 Standard Analyzer
로는 한계가 있었고, 기존의 와일드카드 검색을 계속 유지한다면 검색 속도 저하 문제가 지속될 것으로 사용자 경험이 안좋아질 것을 예상했습니다.
핵심 목표
- 검색의 느린 속도 문제를 해결
- 부분 키워드 검색 기능을 유지
두 요소를 모두 만족시키는 해결책을 찾는 것입니다.
이러한 문제를 해결하기 위해, 검색 시스템의 기존 구조를 변경하기 위한 방법을 탐색하기 시작했습니다.
N-gram을 이용한 방법
아임웹의 검색 시스템 개선에서 중요한 전환점은 N-gram Tokenizer의 적용이었습니다.
N-gram 이란 텍스트를 N 개의 사이즈로 미리 분리하여 저장할 수 있습니다.예를 들어 “커피”라는 단어가 있을 때, ‘커’와 ‘피’라는 두 개의
Token
으로 나눌 수 있는데 이렇게 나누어진 부위를 1-gram 이라고 부릅니다.
여기서 1-gram, 2-gram 그리고 3-gram 크기의 N-gram을 적용함으로써 검색 시스템의 유연성과 정확성을 향상시켰습니다.
PUT my-index-000001
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "my_tokenizer"
}
},
"tokenizer": {
"my_tokenizer": {
"type": "ngram",
"min_gram": 3,
"max_gram": 3,
"token_chars": [
"letter",
"digit"
]
}
}
}
}
}
Example configuration
N-gram Tokenizer를 적용하기 위한 예시 설정입니다.
예를 들면, 사용자가 ‘커피’라는 단어를 포함한 상품을 찾고자 할 때, 1-gram은 ‘커’, ‘피’ 등의 단일 문자로 분리하여 검색할 수 있게 하고, 2-gram은 ‘커피’로 상품을 찾아내는 데 도움을 줍니다.
이는 사용자가 ‘커피머신’이라는 상품명의 전체나 정확한 부분을 기억하지 못하더라도, 관련 상품을 빠르고 정확하게 찾을 수 있도록 돕습니다.
개선 여정의 결과
이제 개선 여정의 결과를 볼 차례입니다.
이 그래프는 8월 5일부터 8월 11일까지의 Latency를 밀리초(ms) 단위로 나타낸 것입니다. 개선 전, Latency는 평균 1,000ms 를 유지하고 있었습니다.
latency는 검색을 실행하는 데 걸리는 시간을 요청 검색 수로 나눈 값입니다. 여기에는 primary shard와 replica shard가 고려됩니다.
개선 작업 이후 8월 11일을 기점으로 Latency가 눈에 띄게 감소한 것을 확인할 수 있었습니다.
와일드카드 검색과 N-gram 성능 비교
성능 개선 작업의 효과를 파악하기 위해서는 전후 비교가 필수적이라고 생각됩니다.
왼쪽 지표를 통해 와일드카드 검색의 성능을 살펴보고, 오른쪽 지표를 통해 N-gram적용 후의 개선된 성능을 확인할 수 있습니다.
이 두 지표의 비교는 N-gram적용이 검색 시스템에 미친 영향을 한눈에 이해할 수 있게 해줍니다.
검색 시간의 감소는 사용자 경험을 직접적으로 향상시키며, 전반적인 서비스 효율성을 상당히 개선한 것이라고 볼 수 있습니다.
최종 클러스터 성능 비교
최종적으로 Elasticsearch클러스터 내에서 상품 검색이 두 번째로 많은 리소스를 사용하고 있어, 개선 작업 이후 모든 인덱스의 Search Latency가 낮아진 것을 확인할 수 있었습니다.
현재는
해당 개선 작업을 진행하고 나서 아임웹 검색 시스템에서는 N-gram을 빼놓을 수 없게 되었습니다.
상품 검색뿐만이 아닌 주문 검색과 같은 다른 검색 영역에도 확장하는 작업을 담당했습니다.
마무리하며
비록 이 글에 모두 담지는 못했지만, 고객에게 중단 없는 검색 서비스를 제공하기 위해 많은 노력을 기울였습니다. 그 과정은 쉽지 않았지만 그만큼 값진 경험이었으며, 이러한 노력 끝에 더 안정적이고 빠른 검색 시스템을 구축할 수 있었다고 생각합니다. 이를 통해 고객 경험을 한층 더 향상시킬 수 있었던 것은 매우 보람찬 일이었습니다.
또한, 지속적인 고도화를 통해 안정성과 정확성을 개선하고 있습니다.
이러한 값진 경험을 할 수 있도록 기회와 옆에서 항상 많은 도움을 주신 형섭님께 감사드리며, 개선 과정에서 일정 조정과 지속적인 이해를 보여준 우리 CRM 스쿼드에도 감사를 전합니다.
앞으로 아임웹 검색 시스템과 CRM에도 많은 관심 부탁드립니다.
감사합니다.