Loading...
MySQL 9.5 Reference Manual 9.5의 14.9.6 Fine-Tuning MySQL Full-Text Search의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
MySQL의 full-text search 기능에는 사용자가 조정할 수 있는 parameter가 거의 없습니다. 일부 변경 사항은 소스 코드 수정을 필요로 하기 때문에 MySQL 소스 배포본을 갖고 있다면 full-text search 동작을 더 세밀하게 제어할 수 있습니다. 관련 내용은
Section 2.8, “Installing MySQL from Source”를 참조하십시오.
Full-text search는 효과를 위해 신중하게 튜닝되어 있습니다. 대부분의 경우 기본 동작을 수정하면 실제로 효과가 떨어질 수 있습니다. 무슨 일을 하는지 정확히 알고 있지 않다면 MySQL source를 수정하지 마십시오.
이 절에서 설명하는 대부분의 full-text 변수는 서버 시작 시점에 설정해야 합니다. 변경 사항을 적용하려면 서버 재시작이 필요하며, 서버가 실행 중인 동안에는 변경할 수 없습니다.
일부 변수 변경은 테이블에 있는 FULLTEXT 인덱스를 재구축해야 합니다. 그 방법은 이 절의 후반부에 설명되어 있습니다.
인덱싱할 단어의 최소 및 최대 길이는 InnoDB 검색 인덱스의 경우 innodb_ft_min_token_size와 innodb_ft_max_token_size에 의해 정의되고, MyISAM의 경우 ft_min_word_len과 ft_max_word_len에 의해 정의됩니다.
참고
Minimum 및 maximum word length full-text 파라미터는 ngram 파서를 사용하여 생성된 FULLTEXT 인덱스에는 적용되지 않습니다. ngram 토큰 크기는 ngram_token_size 옵션으로 정의됩니다.
이러한 옵션 중 하나라도 변경한 후에는 변경 사항이 적용되도록 FULLTEXT 인덱스를 재구축해야 합니다. 예를 들어, 두 글자의 단어를 검색 가능하게 만들기 위해 옵션 파일에 다음과 같은 라인을 추가할 수 있습니다:
1[mysqld] 2innodb_ft_min_token_size=2 3ft_min_word_len=2
그런 다음 서버를 재시작하고 FULLTEXT 인덱스를 재구축합니다. MyISAM 테이블의 경우, MyISAM full-text 인덱스를 재구축하기 위한 아래 지침에 나오는 myisamchk 관련 설명을 참고하십시오.
MyISAM 검색 인덱스의 경우, natural language search에 대한 50% 임계값은 선택된 특정 가중치 방식에 의해 결정됩니다. 이를 비활성화하려면, storage/myisam/ftdefs.h에서 다음 라인을 찾습니다:
1#define GWS_IN_USE GWS_PROB
이 라인을 다음과 같이 변경합니다:
1#define GWS_IN_USE GWS_FREQ
그런 다음 MySQL을 재컴파일합니다. 이 경우 인덱스를 재구축할 필요는 없습니다.
참고
이와 같은 변경을 하면 MATCH() 함수에 대해 MySQL이 적절한 relevance 값을 제공하는 능력이 심각하게 저하됩니다. 정말로 그러한 흔한 단어를 검색해야 한다면, 50% 임계값을 따르지 않는 IN BOOLEAN MODE를 사용하여 검색하는 것이 더 낫습니다.
MyISAM 테이블에서 boolean full-text search에 사용되는 연산자를 변경하려면 ft_boolean_syntax 시스템 변수를 설정합니다. (InnoDB에는 이에 해당하는 설정이 없습니다.) 이 변수는 서버가 실행 중인 동안에도 변경할 수 있지만, 글로벌 시스템 변수를 설정할 수 있을 만큼 충분한 권한이 필요합니다(관련 내용은 Section 7.1.9.1, “System Variable Privileges”를 참조). 이 경우 인덱스를 재구축할 필요는 없습니다.
내장 full-text 파서의 경우, 다음 목록에 설명된 여러 방법으로 어떤 문자를 단어 문자로 간주할지 변경할 수 있습니다. 수정을 수행한 다음에는 FULLTEXT 인덱스가 있는 각 테이블에 대해 인덱스를 재구축해야 합니다. 예를 들어, 하이픈 문자('-')를 단어 문자로 취급하려 한다고 가정해 봅시다. 다음 방법 중 하나를 사용합니다:
MySQL 소스 수정: InnoDB의 경우 storage/innobase/handler/ha_innodb.cc, MyISAM의 경우 storage/myisam/ftdefs.h를 참조합니다. 여기에서 true_word_char() 및 misc_word_char() 매크로를 확인합니다. 이 매크로 중 하나에 '-'를 추가하고 MySQL을 재컴파일합니다.
문자 집합 파일 수정: 재컴파일이 필요하지 않습니다. true_word_char() 매크로는 “문자형” 테이블을 사용하여 문자와 숫자를 다른 문자와 구분합니다. 문자 집합 XML 파일 중 하나의 <ctype><map> 배열 내용을 편집하여 '-'가 “letter”가 되도록 지정할 수 있습니다. 그런 다음 해당 문자 집합을 FULLTEXT 인덱스에 사용합니다. <ctype><map> 배열 형식에 대한 정보는 Section 12.13.1, “Character Definition Arrays”를 참조하십시오.
인덱스가 지정된 컬럼에서 사용되는 문자 집합에 대해 새 콜레이션을 추가한 다음, 해당 컬럼이 그 콜레이션을 사용하도록 변경합니다. 콜레이션 추가에 대한 일반적인 정보는 Section 12.14, “Adding a Collation to a Character Set”를 참조하십시오. Full-text 인덱싱에 특화된 예시는 Section 14.9.7, “Adding a User-Defined Collation for Full-Text Indexing”를 참조하십시오.
다음 full-text 인덱스 변수를 수정한 후 변경 사항이 적용되려면 FULLTEXT 인덱스를 재구축해야 합니다: innodb_ft_min_token_size; innodb_ft_max_token_size; innodb_ft_server_stopword_table; innodb_ft_user_stopword_table; innodb_ft_enable_stopword; ngram_token_size.
innodb_ft_min_token_size, innodb_ft_max_token_size, ngram_token_size를 수정하는 경우에는 서버 재시작이 필요합니다.
InnoDB 테이블의 FULLTEXT 인덱스를 재구축하려면, ALTER TABLE의 DROP INDEX 및 ADD INDEX 옵션을 사용하여 각 인덱스를 드롭한 다음 다시 생성합니다.
Full-text 인덱스가 있는 테이블에서 OPTIMIZE TABLE을 실행하면 full-text 인덱스가 재구축되며, 삭제된 Document ID가 제거되고 가능한 경우 같은 단어에 대한 여러 엔트리가 통합됩니다.
Full-text 인덱스를 최적화하려면 innodb_optimize_fulltext_only를 활성화한 다음 OPTIMIZE TABLE을 실행합니다.
1mysql> set GLOBAL innodb_optimize_fulltext_only=ON; 2Query OK, 0 rows affected (0.01 sec) 3 4mysql> OPTIMIZE TABLE opening_lines; 5+--------------------+----------+----------+----------+ 6| Table | Op | Msg_type | Msg_text | 7+--------------------+----------+----------+----------+ 8| test.opening_lines | optimize | status | OK | 9+--------------------+----------+----------+----------+ 101 row in set (0.01 sec)
대용량 테이블의 full-text 인덱스를 재구축할 때 걸리는 긴 시간을 피하려면, innodb_ft_num_word_optimize 옵션을 사용하여 최적화를 여러 단계로 나눌 수 있습니다. innodb_ft_num_word_optimize 옵션은 OPTIMIZE TABLE을 실행할 때마다 최적화되는 단어 수를 정의합니다. 기본값은 2000으로, OPTIMIZE TABLE을 실행할 때마다 2000개의 단어가 최적화된다는 의미입니다. 이후의 OPTIMIZE TABLE 작업은 이전 OPTIMIZE TABLE 작업이 종료된 지점부터 계속 진행됩니다.
인덱싱에 영향을 주는 full-text 변수( ft_min_word_len, ft_max_word_len, ft_stopword_file)를 수정하거나 stopword 파일 자체를 변경한 경우, 변경을 적용하고 서버를 재시작한 후에 FULLTEXT 인덱스를 재구축해야 합니다.
MyISAM 테이블의 FULLTEXT 인덱스를 재구축하는 데에는 QUICK repair 작업만으로도 충분합니다:
1mysql> REPAIR TABLE tbl_name QUICK;
또는 앞에서 설명한 것처럼 ALTER TABLE을 사용할 수도 있습니다. 일부 경우에는 repair 작업보다 이 방법이 더 빠를 수 있습니다.
FULLTEXT 인덱스를 하나라도 포함하는 각 테이블에 대해 위와 같이 repair를 수행해야 합니다. 그렇지 않으면 해당 테이블에 대한 쿼리 결과가 잘못될 수 있으며, 테이블을 수정할 경우 서버는 해당 테이블이 손상되었고 repair가 필요한 것으로 인식하게 됩니다.
myisamchk를 사용하여 repair나 analyze와 같이 MyISAM 테이블 인덱스를 수정하는 작업을 수행하는 경우, FULLTEXT 인덱스는 최소 단어 길이, 최대 단어 길이 및 stopword 파일에 대해 기본 full-text 파라미터 값으로 재구축됩니다(별도로 지정하지 않는 한). 이로 인해 쿼리가 실패할 수 있습니다.
이 문제는 이러한 파라미터가 서버에서만 알려져 있고 MyISAM 인덱스 파일에는 저장되지 않기 때문에 발생합니다. 서버에서 사용하는 최소 또는 최대 단어 길이 값이나 stopword 파일 값을 변경했다면, 이 문제를 피하기 위해 myisamchk에도 서버에서 사용하는 것과 동일한 ft_min_word_len, ft_max_word_len, ft_stopword_file 값을 지정해야 합니다. 예를 들어, 최소 단어 길이를 3으로 설정한 경우, 다음과 같이 myisamchk로 테이블을 repair할 수 있습니다:
1myisamchk --recover --ft_min_word_len=3 tbl_name.MYI
myisamchk와 서버가 full-text 파라미터에 대해 동일한 값을 사용하도록 하려면, 각 파라미터를 옵션 파일의 [mysqld] 섹션과 [myisamchk] 섹션에 모두 지정합니다:
1[mysqld] 2ft_min_word_len=3 3 4[myisamchk] 5ft_min_word_len=3
MyISAM 테이블 인덱스를 수정하기 위해 myisamchk 대신 사용하는 또 다른 방법은 REPAIR TABLE, ANALYZE TABLE, OPTIMIZE TABLE, ALTER TABLE 구문을 사용하는 것입니다. 이러한 구문은 서버에서 수행되며, 서버는 사용할 올바른 full-text 파라미터 값을 알고 있습니다.
14.9.5 Full-Text Restrictions
14.9.7 Adding a User-Defined Collation for Full-Text Indexing