[Mysql]Full Text

Mysql 전체 텍스트 검색은 검색 구분 기호로 텍스트에 공백이 있는 추출된 토큰을 인덱싱합니다.


다만 공백 등의 구분자가 없는 본문을 검색할 경우에는 한계가 있다.


[Mysql]Full Text 1

select content from tb_fts_test where match content against ('ser 구마');


[Mysql]Full Text 2

위의 제한 사항은 ngram 파서를 사용하여 극복할 수 있습니다.

ngram 파서 구성

ALTER TABLE `002`.`tb_fts_test` 
ADD FULLTEXT INDEX `IDX1` (`CONTENT`) WITH PARSER ngram VISIBLE;

설정 후 쿼리 결과

select content from tb_fts_test where match content against ('ser 구마');


[Mysql]Full Text 3

ngram은 주어진 텍스트 내용을 연속된 문자로 나누어 아래와 같이 색인을 생성합니다.

텍스트: abc

생성된 인덱스: ab, bc, cd

위와 같이 인덱스가 생성되기 때문에 전체 단어가 아닌 부분 단어만 검색이 가능합니다.

ngram이 설정된 순간부터 최소 토큰 크기는 더 이상 innodb_ft_min_token_size 설정을 보지 않고 ngram_token_size 설정을 봅니다.

ngram_token_size의 기본 크기는 2이며 my.conf에서 1에서 10까지 설정할 수 있습니다.

(mysqld)
ngram_token_size=2

ngram이 설정되면 기본 전체 텍스트 검색을 사용하는 것처럼 다음 변경 사항이 적용됩니다.

불용어 처리 변경

전체 텍스트 검색 기능을 사용할 때 토큰화된 단어가 STOPWORD에 등록된 단어와 일치하는 경우에만 인덱싱이 제한되었습니다.

ngram을 적용한 후 빌드가 제한됩니다.

B. 토큰화된 단어에 STOPWORD가 포함된 경우.

가사: “a,b”

중지 단어: “a”

ngram(size=2) 적용 후 생성된 토큰: “a,” 및 “,b”

결과

“a”는 STOPWORD에 지정된 “a”를 포함하므로 인덱싱되지 않습니다.

검색 처리의 변경 사항


[Mysql]Full Text 4

자연어 모드에서

select content from tb_fts_test where match content against ('피자는');

결과


[Mysql]Full Text 5

ngram은 “pizza”와 “sleep”을 2개의 토큰으로 변환하여 검색을 수행하고, 1개의 토큰으로 “고구마 피자”를, 2개의 토큰으로 “pizza 맛있다”를 검색합니다.

부울 모드에서

select content from tb_fts_test where match content against ('피자는' in boolean mode);

결과


[Mysql]Full Text 6

부울 모드를 사용하면 검색어로 사용된 “피자” 토큰이 포함된 “피자가 맛있다”만 검색됩니다.

ngram 파서 와일드카드 검색 및 ngram 파서 구문 검색의 두 가지 검색 처리에 대한 다른 변경 사항이 있지만 이 문서에서는 다루지 않습니다.

위의 두 과정은 다음 URL에서 확인하실 수 있습니다.

https://dev.mysql.com/doc/refman/8.0/en/fulltext-search-ngram.html