실전 프로젝트
이번 주는 크게 페이지네이션과 풀텍스트 인덱스를 공부했다. 원래 OFFSET 기반의 페이지네이션을 cursor기반 페이지네이션으로 변경했다. 이유는 크게 두 가지인데 첫째는 OFFSET방식은 페이지가 넘어갈수록 속도가 느려지는 부분이었고 두번째는 원래 페이지네이션에서 카운트쿼리가 속도의 대부분을 잡아먹는 문제가 있었다. 커서 페이지네이션을 적용함으로써 두 문제를 해결하였고 그렇게 쉽게(?) 넘어가는 듯했다.
하지만 풀텍스트 인덱스를 적용하고 난 뒤, 기본정렬이 뒤틀려서 페이지를 넘어가도 상위 몇 개의 제품은 계속 남아있는 문제가 발생하였다. 문제의 원인을 파악해보니 기존의 데이터는 Id오름차순으로 데이터가 출력됐는데 풀텍스트 인덱스를 적용해서 나오는 결과는 정확도라는 점수를 기반으로 내림차순 정렬되어서 생긴 문제였다. 점수가 같으면 Id 오름차순으로 정렬됐는데 그래서 몇 개의 제품이 계속 페이지를 넘어가도 남아있는 현상이 생겼던 것이다. 그래서 결과의 정확성도 값으로 뽑아서 정렬에 반영시켜 줌으로써 문제를 해결하였다.
그 다음은 검색의 속도 향상을 위해서 풀텍스트 인덱스를 도입하고 여러 필터들에 어떻게 인덱스를 적용해야지 빠른 검색이 가능할 지 여러가지 시도를 해봤다. 테스트를 통해서 풀텍스트 인덱스만으로는 한계가 있다는 점을 깨달았다.
가장 큰 문제점은 mysql이 하나의 쿼리에 인덱스를 하나밖에 태울 수 없다는 점인데 풀텍스트 인덱스는 다른 인덱스와는 달리 복합 인덱스도 적용할 수가 없어서 검색어 풀텍스트 인덱스를 적용하면 다른 필터에는 인덱스를 태울수가 없었다. 그렇게 되니 검색속도는 엄청 빨라졌지만 필터를 적용하면 10초정도 대기를 해야지 결과를 받을 수 있었다.
다음 문제는 점수 기준인데 간단하게 설명하자면 키워드의 빈도만 측정하여 점수를 매기는 시스템이다. 그렇다보니 키워드가 많이 들어간 제목의 책들이 항상 상위권에 올라왔고 원하는 책은 후순위로 밀려있었다. 이와 달리 엘라스틱 서치는 길이가 길면 점수가 떨어지는 알고리즘이 기본적으로 적용되어 있고 추가적으로 'should'라는 쿼리를 이용하면 원하는 조건에 가산점을 부여하는 방법도 존재한다.
크게 위와같은 이유로 풀텍스트 인덱스의 한계점을 느끼고 엘라스틱 서치로 넘어가기로 결정하고 어제부터 엘라스틱 서치 공부에 들어갔다. 문법도 모르고 스프링에서 세팅하는 방법도 모르니 여간 어려운게 아니다. 어제 낮부터 지친기운이 느껴져서 오늘은 푹 쉬고 내일부터 다시 공부할 생각이다.
'항해99 > TIL | WIL' 카테고리의 다른 글
| 2023.04.03 (85일) (0) | 2023.04.04 |
|---|---|
| 2023.04.02 (84일) (0) | 2023.04.02 |
| 2023.04.01 (83일) (0) | 2023.04.02 |
| 2023.03.31 (82일) (0) | 2023.03.31 |
| 2023.03.30 (81일) (0) | 2023.03.31 |