커리큘럼
home
React
home

수업 탐색(검색/찜하기)

Created
2025/02/03 06:10
Tags

수업 탐색(검색/찜하기)

해당 기능은 사용자가 원하는 수업을 효율적으로 찾고 관리할 수 있도록 설계되었습니다. 이 기능의 핵심 요소는 다음과 같습니다

강사, 제목, 설명, 가격순 카테고리 제공
사용자는 강사 이름, 수업 제목, 설명, 가격 등의 다양한 카테고리를 기준으로 수업을 쉽게 필터링하고 탐색할 수 있습니다. 이를 통해 자신에게 가장 적합한 수업을 빠르게 찾을 수 있습니다.
검색 기능
사용자는 원하는 키워드를 입력하여 관련 수업을 검색할 수 있습니다. 예를 들어 “은퇴”라는 키워드를 검색하면, 제목이나 설명에 은퇴라는 단어가 포함된 수업이 결과로 출력됩니다. 이는 elasticsearch를 활용하여 사용자가 입력한 키워드와 연관된 수업을 정확하고 빠르게 검색할 수 있도록 합니다.
찜하기 기능
사용자는 관심 있는 수업을 찜하여 나중에 쉽게 다시 찾아볼 수 있습니다. 찜한 수업은 별도로 관리할 수 있습니다, 여러 수업을 비교하거나 나중에 수강 계획을 세우는 데 유용합니다!!
찜하기 전
찜하기 후
찜목록

트러블 슈팅

문제 : 검색 결과의 정확도와 성능 최적화

문제 : 검색 결과가 예상보다 더 많은 결과를 반환하거나, 원하는 결과를 충분히 반영하지 않는 문제가 발생했습니다. 이 문제는 특히 fuzziness, minimum_should_match와 같은 파라미터들이 제대로 튜닝되지 않았을 때 발생했습니다.
해결 :
minimum_should_match 값을 조정하여, 조금 더 유연한 검색 결과를 얻었습니다.
fuzziness를 2로 설정하여 사용자의 오타나 유사한 철자에도 유연하게 반응하도록 했습니다. 그러나 fuzziness를 높게 설정하면 너무 많은 결과가 반환되는 문제가 발생했기에, 적절한 값을 찾는 과정이 필요했습니다.
검색의 우선순위를 조정하기 위해 title, teacher, description 필드의 가중치를 조정했습니다. 처음에는 title에 높은 가중치(^3)를 주고, description에는 상대적으로 낮은 가중치(^1)를 설정했습니다. 하지만 실제로 검색을 테스트해 보니, description이 검색에 더 중요하게 반영될 필요가 있다는 점을 발견하여 description 필드의 가중치를 ^2로 조정했습니다.

문제 : 검색어 오타 처리 및 유사어 검색

문제 : 사용자가 검색어를 입력할 때 발생하는 오타나 유사한 단어에 대해 검색 결과가 제대로 나오지 않는 경우가 있었습니다. 예를 들어, 은퇴를 은타 로 잘못 입력했을 때 검색 결과가 전혀 나오지 않는 문제가 발생했습니다.
해결 :
fuzziness를 2로 설정하여 오타가 포함된 검색어도 유사한 결과를 반환할 수 있도록 했습니다. 그러나, 너무 많은 오타를 허용하면 검색 결과의 정확도가 떨어질 수 있어, prefix_length를 1로 설정하여 검색어의 처음 몇 글자가 일치하도록 제한했습니다.
private buildSearchQuery(keyword: string, category?: string): any { if (!keyword) { return { match_all: {} } } const sharedQueryParams = { fuzziness: 2, prefix_length: 1, max_expansions: 50, operator: 'or', minimum_should_match: '65%', } const fields = ['title^3', 'description^2', 'teacher^1.5', 'location^1'] if (category && category !== 'price') { return { bool: { should: [ { match: { [category]: { query: keyword, ...sharedQueryParams, boost: 2, }, }, }, { multi_match: { query: keyword, fields: fields, ...sharedQueryParams, type: 'best_fields', tie_breaker: 0.3, }, }, ], minimum_should_match: 1, }, } } else { return { multi_match: { query: keyword, fields: fields, ...sharedQueryParams, type: 'best_fields', tie_breaker: 0.3, }, } } }
TypeScript
복사

Background Task

검색 기능

인덱스 관리
수업 승인, 수정, 삭제 시점에서 @elastic/elasticsearch의 index, update, delete 메서드를 사용하여 해당 수업 데이터의 인덱스를 자동으로 생성, 수정, 삭제하도록 구현하였습니다. 이를 통해 실시간으로 데이터가 Elasticsearch에 반영됩니다. 또한, 인덱스 관리 과정에서 예기치 않은 오류나 문제 발생 시를 대비해, 주 1회 크론 작업을 통해 모든 인덱스를 검토하고, 필요시 자동으로 업데이트 및 삭제를 진행하도록 설정하였습니다.
검색
검색 방법은 1. 일반 검색과 2. 카테고리 검색으로 나뉩니다.
일반 검색에서는 제목, 강사, 설명, 지역 필드에 가중치를 다르게 부여하여 검색 우선순위를 설정하였습니다. 이 과정에서 제목이 가장 우선시되도록 하였습니다. 또한, match 쿼리를 사용하여 특정 검색어와 일치하는 문서에는 2배의 가중치를 적용해 높은 점수를 부여하였고, 여러 필드에서 동일한 점수가 나오는 경우 tie_breaker를 이용해 30%의 가중치를 반영하여 최종 점수를 측정했습니다.
가격순 검색의 경우, 검색 쿼리에서는 일반적인 필드에 대한 가중치가 적용되지 않습니다. 대신, 검색 결과를 가격에 따라 오름차순(asc) 또는 내림차순(desc)으로 정렬하여 결과를 반환합니다. 이때도 여러 필드에서 동일한 점수가 나올 경우 tie_breaker를 통해 30%의 가중치를 반영하여 최종 점수를 결정합니다.