ElasticSearch ‐ (미니 프로젝트) ElasticSearch로 쿠팡 상품 검색 기능 구현 - dnwls16071/Backend_Summary GitHub Wiki
- SpringBoot(Gradle)
- Spring Data JPA
- MySQL
- 상품 전체 조회 API
- 상품 등록 API
- 상품 삭제 API
- 검색 기능
- 검색을 했을 때 상품명, 상품 설명, 카테고리명을 기반으로 관련된 상품을 검색해야 한다.
- 이 때, 상품명 : 상품 설명 : 카테고리명의 score 가중치를 3 : 1 : 2로 설정하기
- 대소문자 구분없이 검색할 수 있어야 한다.
- 단어의 순서에 상관없이 검색할 수 있어야 한다.
- 삼성 노트북이라는 상품을 노트북 삼성이라고 검색해도 조회가 되야 한다.
- 상품 설명에 HTML 태그가 섞여서 저장되어 있는데, 검색할 때는 HTML 태그로 검색되지 않아야 한다.
- 한글, 영어 둘 다 검색이 잘 돼야 한다.
- 상품명에 대해서는 아래 값을 동의어로 인식할 수 있어야 한다.
- 카테고리, 가격으로 필터링을 할 수 있어야 한다.
- 특정 카테고리 내에서만 검색할 수 있어야 한다.
- 특정 가격 범위 내에서만 검색할 수 있어야 한다.
- 되도록이면 검색 결과 중 평점이 4.0이 넘는 상품을 상위에 노출시킬 수 있도록 한다.
- 검색어에 어느 정도 오타가 있더라도 유사한 상품을 조회할 수 있어야 한다.\
- samsung notebook이라는 상품을 simsung notebook이라고 검색해도 조회가 되야 한다.
- 상품명에서 일치하는 검색 키워드는 하이라이팅 처리( )를 해야 한다.
- 상품이 5개씩 조회되도록 페이지네이션 해야 한다.
- 자동 완성 기능
- 상품명으로만 자동 완성이 되도록 해야 한다.
- 자동 완성 결과가 5개만 조회되도록 설정해야 한다.
❗MySQL과 ElasticSearch의 장단점은 명확하다. MySQL은 트랜잭션을 기반으로 데이터 정합성을 보존해주는 것이 가장 큰 장점이다. 반면 ElasticSearch는 빠른 검색에 최적화 되어 있다.
❗현업에서는 2가지 장점을 둘 다 활용하기 위해 MySQL과 ElasticSearch를 둘 다 활용하는 경우가 많다.
❗이 때, 문제가 되는 점이 데이터를 삽입할 때, MySQL과 ElasticSearch에 둘 다 삽입해주어야 한다는 점이다. 즉, 데이터 동기화 문제를 해결해야 한다. 검색해보면 카프카와 같은 메시지 큐를 활용해 처리하는 경우가 대부분이다.


참고 - [What’s the best way to sync data between MySQL and Elasticsearch]
- 레퍼런스의 답변에서 가능하면 애플리케이션 단에서 MySQL, ElasticSearch에 데이터를 저장할 때 하나의 트랜잭션 내에서 저장하도록 해서 관리를 하고 만약 더 큰 규모로의 확장을 해야 한다면 그 때는 메시지 큐를 쓰는 것이 좋다는 의견이 많았다.