-
Notifications
You must be signed in to change notification settings - Fork 0
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
[BLOOM-114] 지역검색 쿼리 fulltext search 적용 #115
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
오호! 처음 보는 방식이라 신기하네요!! 저도 이것저것 찾아보니 좋은 방식이라는 생각이 듭니다.
하나 고민되는 지점이 있는데,
'서울 가락ㄷ' 처럼 한글을 다 완성시키지 않고 쿼리하게 되면 '+서울 +가락ㄷ' 으로 검색돼서 문제가 발생할 수도 있을 것 같은데, 문제가 발생하지는 않나요?
만약 문제가 생긴다면 createSearchQuery 메서드 실행 전에 ㄱㄴㄷㄹ . . . ㅏㅑㅓㅕ . . . 같은 미완성 한글은 String에서 제거하는 것도 괜찮을 것 같아요! |
맞습니다. 사실 그래서 자모분리를 해야하나 말아야하나 고민이 굉장히 깊었었는데, 말씀하신 부분 굉장히 좋아보입니다!! |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
네 고생하셨습니다!
Close #114
FullTextIndex의 ngram parser를 적용하였습니다.
해당 방식은 Text에 대해 토큰 사이즈만큼 자른 후 인덱스를 생성하는 방식입니다.(Ngram token size는 1로 설정했습니다)
'서울 가락'과 같은 방식으로 검색 시 다음과 같은 쿼리를 생성하고 올바른 결과를 반환합니다.
![스크린샷 2024-09-16 오후 4 28 21](https://private-user-images.githubusercontent.com/64758861/367675296-18be8a07-6182-457d-a1d9-57cbab0ab32a.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk1NDQ2NjUsIm5iZiI6MTczOTU0NDM2NSwicGF0aCI6Ii82NDc1ODg2MS8zNjc2NzUyOTYtMThiZThhMDctNjE4Mi00NTdkLWExZDktNTdjYmFiMGFiMzJhLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTQlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE0VDE0NDYwNVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTFiYmNkN2NjN2JiNWUxOGU3Zjg0NTlmY2EzMzcyYWQxYjQ0MTA2ZDU1MzYwMzg4ODNlNGU0NWNiYTU3M2U0MjEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.K3-EMn75_46P6SbWLo5-7CceOpXa9g_7IcDh2T70URk)
SELECT id, name FROM region WHERE MATCH(region.name) AGAINST('+서울 +가락' IN BOOLEAN MODE)
속도 차이는 다음과 같습니다.
사진의 첫번째 줄 마지막 시간이 해당 쿼리가 완료된 시간(ms)인데요. 여러번 실행의 평균값을 놓는다고 해도 20ms->0.5ms로 97.5% 성능 개선이 이루어졌습니다.
EXPLAIN ANALYZE SELECT id, name FROM region WHERE name LIKE '%송파%' LIMIT 30;
EXPLAIN ANALYZE SELECT id, name FROM region WHERE MATCH(region.name) AGAINST('+송파' IN BOOLEAN MODE) LIMIT 30;
다음과 같은 내용을 고민했습니다.
식물 검색시 처럼 자모분리를 해서 검색을 진행하려고 했으나 다음과 같은 문제가 있었습니다.
SELECT id, name FROM region WHERE MATCH(region.decomposed_name) AGAINST('+ㅅㅓ' IN BOOLEAN MODE) LIMIT 30;