Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BE] 게시글 검색 Full-text Search 적용 #264

Merged
merged 7 commits into from
Oct 24, 2023
Merged

[BE] 게시글 검색 Full-text Search 적용 #264

merged 7 commits into from
Oct 24, 2023

Conversation

Jinwook94
Copy link
Owner

@Jinwook94 Jinwook94 commented Oct 24, 2023

배경

  • 게시글 조회에 검색 쿼리가 포함된 경우, LIKE 연산자의 한계로 쿼리 실행 시간이 매우 길어질 수 있음
  • 위 문제 때문에 Like 연산자 사용하지 않고 Full-text Search 사용하여 응답 시간을 개선하고자 함

작업 내용

  1. Full-text Search 도입으로 사용하지 않게된 PostSearchPredicate 삭제
  2. MATCH AGAINST 사용을 위해 Querydsl 커스텀 함수 추가
  3. FULLTEXT 인덱스 사용하는 게시글 조회 로직 구현
  4. 게시글 조회시 검색 쿼리가 포함된 경우 Full-text Search 사용하도록 분기
  5. post 테이블에 FULLTEXT 인데스 추가
  6. 최소 2글자도 검색되도록 하기 위해 설정 변경 (디폴트로 3글자부터 검색됨)
  7. BOOLEAN MODE 사용하여 부분 검색 가능하도록 변경 9be004b

작업 결과

ezgif com-optimize


검색 쿼리 응답 데이터 수 쿼리 실행 시간 (LIKE 연산자 사용) 쿼리 실행 시간 (FULLTEXT 인덱스 사용)
게시글 100만개 10ms + 1,241ms 5,948 ms + 5,717 ms
important 21,940 19 ms + 2,796 ms 210 ms + 205 ms
테스트 4 10,732 ms 9ms + 10ms
abcde 0 13,048 ms 8ms + 5ms

한계

LIKE 연산자 사용하는 쿼리는 LIMIT 0, 25 조건 있기 때문에 처음으로 일치하는 25개의 결과를 찾으면 즉시 쿼리 실행을 중단하기 때문에 빠름

FULLTEXT 인덱스를 사용하는 쿼리는 일치하는 모든 결과를 찾은 다음, 이를 관련성 점수별로 정렬해야해서 오래 걸림

*FULLTEXT 인덱스는 단어 기반으로 데이터를 색인화하며, 해당 단어들의 출현 빈도와 문서 내의 위치 정보를 저장합니다. 이러한 정보를 바탕으로 특정 검색어에 대한 관련성 점수를 계산합니다. 따라서 FULLTEXT 인덱스를 사용하는 쿼리는 일치하는 결과를 찾은 다음, 이를 관련성 점수별로 정렬해야 합니다. 결과가 많은 경우 (**게시글*의 경우 100만개), 모든 결과를 찾고 정렬하는데 상당한 시간이 소요될 수 있습니다. 물론 LIMIT 조건이 있지만, 관련성이 높은 상위 25개의 결과를 반환하기 위해서는 여전히 전체 결과를 처리해야 합니다.

@Jinwook94 Jinwook94 added the feat New feature or request label Oct 24, 2023
@Jinwook94 Jinwook94 self-assigned this Oct 24, 2023
@Jinwook94 Jinwook94 linked an issue Oct 24, 2023 that may be closed by this pull request
@github-actions
Copy link

Test Results

21 files  21 suites   8s ⏱️
84 tests 84 ✔️ 0 💤 0
85 runs  85 ✔️ 0 💤 0

Results for commit 3e15866.

@Jinwook94 Jinwook94 merged commit cbdb4c8 into main Oct 24, 2023
3 checks passed
@Jinwook94 Jinwook94 deleted the issue263 branch October 24, 2023 18:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
feat New feature or request
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[BE] 게시글 검색 Full-text Search 적용
1 participant