Bookking 프로젝트에서는 사용자의 검색 편의성을 향상시키기 위해 자동완성 기능을 구현하였으며,
목표는 사용자가 입력 중인 키워드에 대해 도서 제목을 정확히 연관되어있는 것으로 추천하는 것이었습니다.
기능은 다음과 같은 단계로 점진적으로 고도화되었습니다.
이 과정에서 다양한 검색 결과 이상 현상, 기대와 다른 정렬 결과, 중복 응답 등의 문제가 발생했고,
그에 따라 정확한 원인 분석 및 해결 방안을 적용했습니다.
자동 완성 기능 V1 (match_phrase_prefix)
자동 완성 기능 V2 (prefix)
“자”로 시작되는 단어가 나와야하는데 전부 다 나옴
V1 : nori_tokenizer로 인해 “자”(키워드)가 포함된 단어만 있어도 검색됨 (정확도가 낮음)
V2 : 문장 접두어 필터링 (prefix 쿼리는 score를 계산하지 않기에 정렬 기준 없음)
title 필드에 "analyzer": "korean_analyzer"가 적용되어 있어서, 형태소 분석된 토큰의 일부가 '자'로 시작하면 전체 문장이 일치된다고 착각해서 위와같이 결과가 나왔었음.
즉, title에 분석기(korean_analyzer)가 붙은 상태에서 prefix를 쓰면,
"모던자바인액션" → ["모던", "자바", "인", "액션"] 중 "자바"에서 prefix match가 걸려버리게 되는거.
V2
“문장 전체가 자로 시작하는 것”만 찾으려면?
.keyword
필드를 지정해서 “분석되지 않은 원본 문자열”을 기준으로 prefix 검색.
{
"query": {
"prefix": {
"title.keyword": {
"value": "자"
}
}
}
}
이렇게 해줌으로써 “모던자바인액션” 같은 중간에 키워드가 들어간 것들은 아예 빠지고,
진짜로 “자”(키워드)로 시작하는 “자바의 정석”, “자바의 남궁성”, 등만 나오게 됨.
그래서 title
로만 하면 형태소 분석으로 인해 자바 단어만 매치되어서 잘못된 결과가 나오니까 title.keyword
로 줘서 정확하게 접두어로 시작하는 전체 문장만 매칭되게 하면 됩니다.
버전 | 쿼리 방식 | 주요 처리 |
---|---|---|
V1 | match_phrase_prefix | 형태소 기준 접두어 검색 (정확도 낮음) |
V2 | prefix + title.keyword | 문장 접두어 필터링 |
V3 | multi_match + boost | 부스트, 자동 정렬(multi_match), 오타 대응(fuzziness를 AUTO로) |
V2
title.keyword 필드와 prefix 쿼리를 활용하여, "자"로 시작하는 도서 제목만 필터링에 성공하였습니다.
"자바의 정석", "자바 인 액션" 등은 포함되었고,
"모던자바인액션", "이펙티브 자바"는 제외됨으로써 정확도는 크게 향상되었습니다.
다만, 정렬 기준이 없어 결과 순서는 색인 순서에 의존하게 되었습니다.
V3
mulit_match 쿼리와 필드별 boost(title^3,…)를 설정하고, fuzziness: AUTO 를 적용하여 오타 대응까지 처리함으로써, 정확도 기반 relevance 정렬 자동 적용이 가능해져
V1~V2에서 발견된 정확도/정렬 문제를 V3에서 완전히 해결했으며, 실사용 환경에서도 자연스러운 추천 결과를 보장할 수 있는 수준까지 고도화하였습니다.