Open mojh7 opened 1 year ago
SET GLOBAL innodb_ft_aux_table = 'test/tb_bi_gram';
SELECT * FROM information_schema.innodb_ft_config;
information_schema.innodb_ft_index_table
information_schema.innodb_ft_index_cache
innodb_ft_cache_size
크기를 넘어서면 한꺼번에 모아서 디스크 파일로 저장함information_schema.innodb_ft_deleted
MySQL 서버의 전문 검색 쿼리
MySQL 서버에서 자연어 검색 모드와 함께 사용할 수 있는 검색어 확장 기능도 지원한다
검색어에 제시된 단어들을 많이 가지고 있는 순서대로 정렬해서 결과를 반환한다
전문 검색 쿼리의 검색어에는 단일 단어외에도 자연어의 문장을 그대로 사용할 수 있다
문장을 그대로 검색어로 사용하는 형태를 메뉴얼에서는 Phrase Search 라고 한다
SELECT id, title, body
MATCH(title, body) AGAINST ('MySQL manual is true guide' IN NATURAL LANGUAGE MODE) AS score
FROM tb_bi_gram
WHERE MATCH(title, body) AGAINST ('MySQL manual is true guide' IN NATURAL LANGUAGE MODE);
문장이 검색어로 사용되면
검색어 사용된 단어의 일부만 포함하는 결과도 가져온다
"."이나 "," 등과 같은 문장 기호는 모두 무시됨
자연어 검색은 단순히 검색어에 포함된 단어들이 존재하는 결과만 가져오는데
불리언 검색은 쿼리에 사용되는 검색어의 존재 여부에 대해 논리적 연산이 가능하다
SELECT id, title, body
MATCH(title, body) AGAINST ('+MySQL -manual' IN BOOLEAN MODE) AS score FROM tb_bi_gram
WHERE MATCH(title, body) AGAINST ('+MySQL -manual' IN BOOLEAN MODE);
MySQL를 포함하지만 manual은 포함하지 않는 레코드를 검색하는 쿼리이다
"+" 표시를 가진 검색 단어는 전문 검색 인덱스 칼럼에 존재해야 하며 "-"는 포함돼 있지 않아야 한다
222p 아래 예제를 보면 '+MySQL +manual'
두 단어를 모두 포함하는 레코드만 검색하는 쿼리를 보면 결과가 1건만 반환됐다
불리언 검색에서 쌍따옴표로 묶인 구는 마치 하나의 단어처럼 취급되어 처리된다
223p 위에 쿼리를 보면 '+"MySQL man"'
사용했는데 "MySQL man"
구문을 가진 레코드를 검색한다
띄어쓰기까지 정확히 일치하는 것을 찾는 것이 아닌 MySQL
단어 뒤에 man
이라는 단어가 나오면 일치하는 것으로 판단
'+"MySQL doc"'
를 사용한 쿼리는 MySQL
와 doc
이라는 2개의 단어가 순서대로 있는 레코드를 찾는데 해당하는 결과가 없어서 0건 반환됐다
불리언 검색에서 불리언 연산자("+", "-" 등)를 전혀 사용하지 않으면 검색어에 포함된 단어 중 아무거나 하나라도 있으면 일치하는 것으로 판단
'MySQL man'
이렇게만 사용하면 MySQL
이나 doc
단어 중 아무거나 하나라도 일치하는 레코드 반환불리언 연산자를 전혀 사용하지 않을 때 자연어 검색과 흡사하게 작동하지만 서로 다른 방식으로 일치율을 계산하는 차이점이 있다
주의
불리언 검색에서 와일드 카드 문자를 이용해서 패턴 검색 적용할 수도 있다
'sour*'
으로 검색하면 MySQL is best open source dbms
반환
하지만 n-gram 인덱스에 대한 불리언 검색에서 와일드카드가 아무런 효과가 없다
'sour'
로 검색해도 위에 결과와 똑같이 반환
이미 n-gram 전문 검색 인덱스의 경우 단어의 일부만 검색하는 기능을 지원하기 때문에 와일드카드 문자를 이용한 패턴 검색 기능이 필요치 않다
다른 연산자들
다음 스터디
~2023-05-09 pm 09:20 화요일~ 2023-05-10 pm 09:20 목요일
정리 범위