핵심 요약
스포카가 식자재 품목 검색 기능의 도입 및 개선으로 검색 품질을 향상시켰으며, Elasticsearch 기반 구현과 다층 개선(마이크로 분석/가중치 조정, N-gram, Wildcard 검색, ICU 초성 검색, Scripted Similarity)으로 기능 신뢰성과 이용 편의성을 높였습니다.
구현 방법
- 초기 문제 인식: DB LIKE 질의로 인한 띄어쓰기/맞춤법 차이의 검색 누락을 해결하기 위해 Elasticsearch 도입을 POC로 진행하고, product 인덱스의 name 필드에 Korean analyzer와 name.ngram 필드를 구성했습니다.
- 기본 구성: name에 Korean analyzer, name.ngram에 Korean_ngram 분석기; edge_ngram 필터를 최소 1에서 최대 5까지 적용하고, nori_mixed 토크나이저를 사용했습니다.
- 초기 성능 비교: DB LIKE 검색과 ES 검색의 품질을 비교하는 POC를 수행했고 ES가 비정확한 키워드에서도 더 나은 결과를 제공하는 것을 확인했습니다.
- 가중치 및 N-gram 최적화: 통베인 검색 이슈를 해결하기 위해 name 필드와 name.ngram 필드의 가중치를 조정하고, edge_ngram의 front(앞부분)만 사용하도록 조정하며 max_gram을 3으로 조정했습니다.
- 다중 검색 채널 도입: Nori/N-gram/Standard 분석기의 조합 가중치를 조정하고, 포함 검색을 강화하기 위해 Wildcard 필드를 도입하는 쿼리를 구성했습니다.
- 사용자 사전의 한계 및 대안: User Dictionary 도입은 관리 포인트 증가 등으로 보류했습니다.
- 초성 검색 도입: JASO와 ICU 중 ICU를 선택하고 ICU Analyzer를 구성했습니다. 저장용 ICUnit 분석기와 검색용 ICUSearchAnalyzer를 분리하고, 초성 검색용으로 only 초성 토큰을 생성하도록 필터를 적용했습니다.
- IDF 제외 및 스코어 커스텀화: Boost IDF 모델 대신 Scripted Similarity를 도입해 토큰 freq 기반의 스코어링을 커스텀화했습니다. 후보로는 간단한 TF(예: sqrt(doc.freq)) 방식과 BM 모델 등 여러 옵션을 고려했습니다.
주요 결과
- 검색 품질이 개선되어 특정 품목(예: 사용자 어휘의 복합어 포함 검색)에서 상위 노출이 더 안정적이었고, 검색의 포함 기반 결과가 강화되었습니다.
- Wildcard 기반 검색과 N-gram/초성 검색의 조합으로 검색 누락 이슈를 줄였으며, 실무에서의 피드백 반영이 가능해졌습니다.
- 유지보수 측면에서의 대안 검토를 통해 효율적이고 확장 가능한 ICU 기반 초성 검색 설계가 선택되었고, Scripted Similarity 도입으로 커스텀 스코어링이 가능해졌습니다.


