안녕하세요. 현재 음악 테이블과 가수 테이블을 나누고 있고, 둘은 many-to-many로 관계테이블 까지 총 3개의 테이블이 있습니다.
그리고 검색을 위해 keyword테이블을 따로 두었습니다. 키워드테이블에는 가수명, 음악명을 각각 저장하였고
k
create table keywordT { id int, keyword varchar(255) full text index ngram parser, singerId int null, musicId int null, }
키워드 테이블은 위와 같이 구성되어있으며 가수의 경우 (keyword:'아이유', singerId:9, musicId:null) , 음악의 경우 (keyword:'좋은 날', singerId:null, musicId:10) 이런식으로 입력을 하고 있습니다.
이렇게 구성하였을 경우, 그냥 '아이유', '좋은날' 키워드는 잘 검색이 되지만 만약 '아이유 좋은 날'이라는 키워드를 사용자가 입력했을 때
select xx from music inner join user_music on user_music.musicId = music.id inner join singer on user_music.singerId = singer.id inner join ( ??? )
위의 물음표에 어떤 식으로 쿼리가 입력되어야할지 감이 오질 않습니다..
match(keyword) against('???' IN BOOLEAN MODE) 에서 ??? 조합법에 대한 팁을 부탁드립니다..감사합니다!
현재는 match(keyword) against('아이유 좋은날' IN BOOLEAN MODE) 로 검색을 한다면
keyword 결과로
singerId | musicId |
9 | null |
null | 9 |
null | 10 |
null | 11 |
이런식으로 좋은날이라는 키워드가 들어있는 음악(musicId-9,10,11)과 아이유(singerId-9)가 검색이 됩니다.
어차피 지금 방식은 헛점이 많은 방식입니다.
가수명이 요즘은 한글 뿐 아니라 영어 약자로 되어 있는 경우도 많고, 그룹명도 있고
노래 제목도 긴 제목도 있어서 "좋은날"인지? '좋은 날" 인지? 띄어쓰기 문제도 발생됩니다.
영어 제목은 대소문자 구별 문제도 발생됩니다.
이 경우 검색어가 개발자가 원하는 대로 입력되라는 보장이 없습니다.
검색엔진이 아닌 테이블 쿼리로는 한계가 있게 마련입니다.
아이유 좋은날
아이유 좋은 날
IU 좋은날
좋은날 아이유
등등 자주 검색되는 패턴을 분석해서 주기적으로 키워드 테이블을 업데이트해야 할 것입니다.
검색엔진도 기본적으로는 이런 방식으로 동작할 것입니다.
검색엔진은 오타보정, 연관검색 등 좀 더 복잡한 로직이겠지만...