방법 1
create fulltext index idx_ft_profile_name_and_name_and_description on profiles(profile_name, firstname_lastname, description);
방법 2
ALTER TABLE profiles ADD FULLTEXT INDEX idx_ft_profile_name_and_name_and_description(profile_name, firstname_lastname, description);
-- 'Elsa'이라는 단어로 FULL TEXT SEARCH 실행 (NATURAL MODE)
SELECT * FROM profiles WHERE MATCH (profile_name, firstname_lastname, description) AGAINST ('Elsa' IN NATURAL LANGUAGE MODE);
-- 1. DROP INDEX
DROP INDEX idx_ft_profile_name_and_name_and_description ON users;
-- 2. CREATE NGRAM INDEX
ALTER TABLE users ADD FULLTEXT INDEX idx_ft_profilename_and_name_and_description(profile_name, firstname_lastname, description) WITH PARSER NGRAM;
: 자연어 검색
ex) SELECT * FROM “테이블명" WHERE MATCH (“검색컬럼명") AGAINST (‘맛집' IN NATURAL LANGUAGE MODE);
💡 자연어란?
- 일반 사회에서 자연히 발생하여 사람이 의사소통에 사용하는 언어
- 인공어와 대비되는 개념 (ex: 프로그래밍 언어)
: 불린 모드 검색
ex) SELECT FROM “테이블명" WHERE MATCH (“검색컬럼명") AGAINST (‘+대구+닭+맛집' IN BOOLEAN MODE);
: 쿼리 확장 검색
2단계에 걸쳐서 검색을 수행한다.
1단계 : 자연어 검색 수행
2단계 : 첫 번째 검색의 결과에 매칭된 행을 기반으로 검색 문자열을 재구성하여 두 번째 검색을 수행
이는 1단계 검색에서 사용한 단어와 연관성이 있는 단어가 1단계 검색에 매칭된 결과에 나타난다는 가정을 전제로 한다.
SELECT * FROM users WHERE MATCH (profile_name, firstname_lastname, description) AGAINST ('Elsa' IN NATURAL LANGUAGE MODE);
SELECT *, MATCH (profile_name, firstname_lastname, description) AGAINST (:keyword IN NATURAL LANGUAGE MODE) as score
FROM users WHERE MATCH(profile_name, firstname_lastname, description) AGAINST(:keyword);
SELECT * FROM users WHERE MATCH (profile_name, firstname_lastname, description) AGAINST (:keyword IN BOOLEAN MODE);
SELECT sid, profile_name, business_account_tf, firstname_lastname, profile_id, n_posts, following, followers, description, url
FROM users u
WHERE MATCH (profile_name, firstname_lastname, description) AGAINST (:keyword IN BOOLEAN MODE)
ORDER BY CASE
WHEN u.firstname_lastname = :original then 1
WHEN u.profile_name = :original then 2
WHEN u.description = :original then 3
ELSE 4 END
LIMIT 20;