mysql 음악검색방법에 대해 문의드립니다. 0 4 1,780

by Kun [SQL Query] mysql [2022.11.11 13:21:36]


안녕하세요. 현재 음악 테이블과 가수 테이블을 나누고 있고, 둘은 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)가 검색이 됩니다.

by 마농 [2022.11.14 09:27:15]

키워드 테이블에 (가수 + 음악) 을 같이 저장하는 방법은 어떤가요?
"아이유 좋은날" 9 10
"좋은날 아이유" 9 10
"아이유" 9 null
"좋은날" null 10


by Kun [2022.11.14 10:09:49]

답변 감사합니다. 해당 방법을 생각해보았는데 그렇게 될 경우 음악명이 변경이 되거나 가수명이 변경이 될때마다 추가를 해주는 방식으로 처리가 되어야할까요?


by 마농 [2022.11.14 10:31:36]

어차피 지금 방식은 헛점이 많은 방식입니다.
가수명이 요즘은 한글 뿐 아니라 영어 약자로 되어 있는 경우도 많고, 그룹명도 있고
노래 제목도 긴 제목도 있어서 "좋은날"인지? '좋은 날" 인지? 띄어쓰기 문제도 발생됩니다.
영어 제목은 대소문자 구별 문제도 발생됩니다.
이 경우 검색어가 개발자가 원하는 대로 입력되라는 보장이 없습니다.
검색엔진이 아닌 테이블 쿼리로는 한계가 있게 마련입니다.

아이유 좋은날
아이유 좋은 날
IU 좋은날
좋은날 아이유
등등 자주 검색되는 패턴을 분석해서 주기적으로 키워드 테이블을 업데이트해야 할 것입니다.
검색엔진도 기본적으로는 이런 방식으로 동작할 것입니다.
검색엔진은 오타보정, 연관검색 등 좀 더 복잡한 로직이겠지만...


by Kun [2022.11.14 10:36:30]

답변 감사합니다. 검색엔진이 답이겠군요 ㅠㅠ

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입