12.9.6 MySQL의 전체 텍스트 검색의 조정
MySQL의 전체 텍스트 검색 기능은 사용자가 조정할 수있는 매개 변수가 거의 없습니다. 일부 변경의 소스 코드를 변경해야하기 때문에, MySQL 소스 배포판을 가지고 있다면, 전체 텍스트 검색의 동작을보다 효과적으로 제어 할 수 있습니다. 섹션 2.9 "소스에서 MySQL 설치" 를 참조하십시오.
전체 텍스트 검색의 효과는 신중하게 조정됩니다. 대부분 경우 기본 동작을 변경하면 실제로는 효과가 낮아질 수 있습니다. 사용 방법을 이해하지 않으면 MySQL 소스는 변경하지 마십시오.
이 섹션에서 설명하는 대부분의 전문 변수는 서버를 시작할 때 설정해야합니다. 변경하려면 서버를 다시 시작해야합니다. 서버가 동작하고있는 경우에는 변경할 수 없습니다.
일부 변수를 변경하려면 테이블의 FULLTEXT
인덱스를 다시 작성해야합니다. 이렇게 자세한 내용은이 섹션의 뒷부분에서 설명합니다.
단어의 최소 길이와 최대 길이의 구성
인덱스가 붙은 단어의 최소 길이와 최대 길이는 InnoDB
검색 인덱스의 경우 innodb_ft_min_token_size
및 innodb_ft_max_token_size
, MyISAM
검색 인덱스의 경우는 ft_min_word_len
및 ft_max_word_len
에서 정의됩니다. 이러한 옵션 중 하나를 변경 한 후 변경 사항을 적용하기 위해 FULLTEXT
인덱스를 다시 작성하십시오. 예를 들어, 2 글자 단어를 검색 가능하게하려면 옵션 파일에 다음 줄을 놓습니다.
[mysqld] innodb_ft_min_token_size = 2 ft_min_word_len = 2
그런 다음 서버를 다시 시작하고 FULLTEXT
인덱스를 다시 작성합니다. MyISAM
테이블은 MyISAM
의 전체 인덱스를 다시 작성하는 데 따르는 단계에서 myisamchk에 대한 주석에 유의하십시오.
자연어 검색 임계 값 구성
MyISAM
검색 인덱스에서 선택된 특정 가중치 체계에 의해 자연어 검색에서 50 %의 임계 값이 결정됩니다. 이를 해제하려면 storage/myisam/ftdefs.h
에서 다음 행을 검색하십시오.
#define GWS_IN_USE GWS_PROB
이 행을 다음과 같이 변경합니다.
#define GWS_IN_USE GWS_FREQ
다음은 MySQL을 다시 컴파일합니다. 이 경우 인덱스를 재구성 할 필요가 없습니다.
이렇게 변경하면 MATCH()
함수에 적절한 관련성 값을 제공하는 MySQL의 능력이 크게 저하됩니다. 이러한 일반적인 단어를 검색 할 필요가있는 경우는, 대신에 50 %의 임계 값에 따르지 않는 IN BOOLEAN MODE
를 사용하여 검색하는 것이 좋습니다.
불리 안 전문 검색 연산자 변경
MyISAM
테이블에서 boolean 텍스트 검색에 사용되는 연산자를 변경하려면 ft_boolean_syntax
시스템 변수를 설정합니다. ( InnoDB
는 비슷한 기능이 없습니다.)이 변수는 서버의 실행 중에 변경할 수 있지만, 그러기 위해서는 SUPER
권한을 가지고 있어야합니다. 이 경우 인덱스를 재구성 할 필요가 없습니다. 이 변수를 설정하는 방법을 제어하는 규칙 내용은 섹션 5.1.4 "서버 시스템 변수" 를 참조하십시오.
문자 집합 변경
다음 목록에 설명 된대로 단어 문자로 간주되는 문자 세트는 여러 가지 방법으로 변경할 수 있습니다. 변경이 완료되면 아무 FULLTEXT
인덱스를 포함하는 테이블마다 인덱스를 다시 작성합니다. 하이픈 ( '-')를 단어 문자로 처리한다고 가정합니다. 다음 방법 중 하나를 사용합니다.
MySQL 소스를 변경합니다.
storage/innobase/handler/ha_innodb.cc
(InnoDB
의 경우) 또는storage/myisam/ftdefs.h
(MyISAM
의 경우)에서true_word_char()
및misc_word_char()
매크로를 참조하십시오. 그 매크로 중 하나에'-'
를 추가하고 MySQL을 다시 컴파일합니다.문자 집합 파일을 변경합니다. 다시 컴파일 할 필요는 없습니다.
true_word_char()
매크로는 숫자와 기타 문자를 구별하기 위해 "character type"테이블이 사용됩니다. 문자 집합 XML 파일 중 하나에서<ctype><map>
배열의 내용을 편집하면'-'
가 '문자'가되도록 지정할 수 있습니다. 다음은FULLTEXT
인덱스에 지정된 문자 세트를 사용합니다.<ctype><map>
배열 형식에 대해서는 섹션 10.3.1 "문자 정의 배열" 을 참조하십시오.인덱스 된 컬럼에서 사용되는 문자 집합에 새로운 데이터 정렬을 추가하고 데이터 정렬이 사용되도록 열을 변경합니다. 데이터 정렬의 추가에 대한 일반적인 정보는 섹션 10.4 "문자 세트에 데이터 정렬 추가" 를 참조하십시오. 전문 인덱싱에 고유의 예는 섹션 12.9.7 "전문 인덱싱 데이터 정렬 추가" 를 참조하십시오.
InnoDB 전체 인덱스 다시 작성
인덱싱에 영향을 미치는 전체 변수 ( innodb_ft_min_token_size
, innodb_ft_max_token_size
, innodb_ft_server_stopword_table
, innodb_ft_user_stopword_table
, innodb_ft_enable_stopword
)을 변경하는 경우에는 변경 한 후에 FULLTEXT
인덱스를 다시 작성해야합니다. innodb_ft_min_token_size
및 innodb_ft_max_token_size
변수는 동적으로 구성 할 수 없기 때문에 변경하려면 서버를 다시 시작하고 인덱스를 다시 작성해야합니다.
InnoDB
테이블의 FULLTEXT
인덱스를 재 구축하려면 DROP INDEX
및 ADD INDEX
옵션을 사용하여 ALTER TABLE
을 사용하여 각 인덱스를 삭제하고 다시 만듭니다.
InnoDB 전체 텍스트 인덱싱 최적화
전체 텍스트 인덱싱 된 테이블에서 OPTIMIZE TABLE
을 실행하면 전체 인덱스가 다시 작성되고 삭제 된 문서 ID가 삭제되어 같은 단어에 대해 여러 항목이 연결됩니다 (가능한 경우).
전체 텍스트 인덱싱을 최적화하려면 innodb_optimize_fulltext_only
을 사용하여 OPTIMIZE TABLE
을 실행합니다.
mysql> set GLOBAL innodb_optimize_fulltext_only=ON; Query OK, 0 rows affected (0.01 sec) mysql> OPTIMIZE TABLE opening_lines; +--------------------+----------+----------+----------+ | Table | Op | Msg_type | Msg_text | +--------------------+----------+----------+----------+ | test.opening_lines | optimize | status | OK | +--------------------+----------+----------+----------+ 1 row in set (0.01 sec)
큰 테이블에서 전체 인덱스 재 작성 시간이 길어지는 것을 방지하려면 innodb_ft_num_word_optimize
옵션을 사용하면 최적화를 단계적으로 실행할 수 있습니다. innodb_ft_num_word_optimize
옵션은 OPTIMIZE TABLE
이 수행 될 때마다 최적화 된 단어의 수가 정의됩니다. 기본 설정은 2000입니다. 이것은 OPTIMIZE TABLE
이 수행 될 때마다 2000 개의 단어가 최적화되는 것을 나타냅니다. 후속 OPTIMIZE TABLE
연산은 선행하는 OPTIMIZE TABLE
연산이 종료 한 장소에서 계속됩니다.
MyISAM 전체 인덱스 다시 작성
인덱싱에 영향을 미치는 전체 변수 ( ft_min_word_len
, ft_max_word_len
또는 ft_stopword_file
)을 변경하거나 중지 단어 파일 자체를 변경하는 경우 변경하여 서버를 재시작 한 후, FULLTEXT
인덱스를 재 구축하는 해야합니다.
MyISAM
테이블의 FULLTEXT
인덱스를 재 구축하려면 QUICK
복구 작업을 수행하면 충분합니다.
mysql> REPAIR TABLE tbl_name
QUICK;
또는 앞에서 언급 한 ALTER TABLE
을 사용합니다. 이것은 복구 연산보다 빨라질 가능성도 있습니다.
임의의 FULLTEXT
인덱스를 포함한 각 테이블은 위와 같이 복구해야합니다. 그렇지 않으면 테이블의 쿼리에서 잘못된 결과가 생성 될 가능성이 테이블을 변경하면 서버는 테이블이 손상되고 복구가 필요하다고 간주됩니다.
myisamchk를 사용하여 MyISAM
테이블 인덱스를 변경하는 연산 (복구 및 분석 등)을 실행하는 경우, 그 밖에 지정이 없으면 단어의 최소 길이 단어의 최대 길이 및 스톱 워드 파일의 기본 전체 매개 변수 값을 사용하여 FULLTEXT
인덱스가 다시 작성됩니다. 이렇게하면 쿼리에 실패 할 가능성이 있습니다.
이 문제는 이러한 매개 변수가 서버에서만 인식되는 것이 원인으로 발생합니다. MyISAM
인덱스 파일에 저장되지 않습니다. 서버에서 사용되는 단어의 최소 길이와 최대 길이 또는 스톱 워드 파일의 값을 변경했을 경우의 문제를 해결하려면 mysqld에서 사용되는 myisamchk와 같은 ft_min_word_len
, ft_max_word_len
및 ft_stopword_file
값을 지정합니다 . 예를 들어, 단어의 최소 길이를 3으로 설정 한 경우에는 다음과 같이 myisamchk를 사용하여 테이블을 복구 할 수 있습니다.
shell> myisamchk --recover --ft_min_word_len=3 tbl_name
.MYI
myisamchk 및 서버에서 전체 매개 변수에 대해 동일한 값이 사용되도록하려면 옵션 파일의 [mysqld]
과 [myisamchk]
의 두 섹션에 각각 배치하십시오.
[mysqld] ft_min_word_len = 3 [myisamchk] ft_min_word_len = 3
MyISAM
테이블 인덱스의 변경에 myisamchk를 사용하는 방법에 대한 대안으로 REPAIR TABLE
, ANALYZE TABLE
, OPTIMIZE TABLE
또는 ALTER TABLE
문을 사용합니다. 이러한 진술은 적절하게 사용되는 전체 매개 변수 값이 인식되는 서버에서 실행됩니다.