1# 2# InnoDB FULLTEXT SEARCH: CJK support - ngram parser 3# 4# 5 6--source include/have_innodb.inc 7 8# Must have debug code to use SET DEBUG 9--source include/have_debug.inc 10# Embedded server does not support restarting 11--source include/not_embedded.inc 12 13# Enable diag print to print query parse tree 14SET GLOBAL innodb_ft_enable_diag_print = 1; 15 16-- echo # Test Case 1: Test English with Default(latin1) Charset 17# Ignore ngram token check for latin1. 18SET DEBUG="+d,fts_instrument_ignore_ngram_check"; 19 20CREATE TABLE articles ( 21 id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, 22 title VARCHAR(200) 23 ) ENGINE=InnoDB; 24 25ALTER TABLE articles ADD FULLTEXT INDEX (title) WITH PARSER ngram; 26 27INSERT INTO articles (title) VALUES 28 ('what is M'), 29 ('Myname is wonder'), 30 ('My SQL is good'), 31 ('MySQL database'), 32 ('Mind a good thing'), 33 ('Mind good idea'); 34 35SELECT * FROM articles WHERE 36 MATCH(title) AGAINST('m*' IN BOOLEAN MODE); 37 38SELECT * FROM articles WHERE 39 MATCH(title) AGAINST('my*' IN BOOLEAN MODE); 40 41SELECT * FROM articles WHERE 42 MATCH(title) AGAINST('+mind -mysql' IN BOOLEAN MODE); 43 44SELECT * FROM articles WHERE 45 MATCH(title) AGAINST('+(mind thing) -idea' IN BOOLEAN MODE); 46 47SELECT * FROM articles WHERE 48 MATCH(title) AGAINST('mysql'); 49 50SELECT * FROM articles WHERE 51 MATCH(title) AGAINST('mysql' IN BOOLEAN MODE); 52 53SELECT * FROM articles WHERE 54 MATCH(title) AGAINST('"mysql"' IN BOOLEAN MODE); 55 56SELECT * FROM articles WHERE 57 MATCH(title) AGAINST('"my sql"' IN BOOLEAN MODE); 58 59SET DEBUG="-d,fts_instrument_ignore_ngram_check"; 60 61DROP TABLE articles; 62 63SET NAMES utf8; 64 65-- echo # Test Case 2: Test Stopwords 66# Compare with results without stopword check. 67SET DEBUG="+d,fts_instrument_ignore_ngram_check"; 68 69# Without stopwords 70CREATE TABLE articles ( 71 id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, 72 title VARCHAR(200), 73 body TEXT 74 ) ENGINE=InnoDB DEFAULT CHARACTER SET gb2312 COLLATE gb2312_chinese_ci; 75 76CREATE FULLTEXT INDEX ft_index ON articles(title, body) WITH PARSER ngram; 77 78INSERT INTO articles (title, body) VALUES 79 ('从简单购物清单到画展','或企业网络中的海量数据'), 80 ('要想将数据添加到数据库','访问、处理计算机数据库中保存的数据'), 81 ('从简单的购物清单到画展','或企业网络中的海量数据'), 82 ('要想将数据添加到数据库','或访问、处理计算机数据库中保存的数据'), 83 ('数据库是数据的结构化集合','它可以是任何东西'); 84 85SELECT * FROM articles WHERE 86 MATCH(title, body) AGAINST('的* 或* 东西' IN BOOLEAN MODE); 87 88SELECT * FROM articles WHERE 89 MATCH(title, body) AGAINST('简单的' IN BOOLEAN MODE); 90 91SELECT * FROM articles WHERE 92 MATCH(title, body) AGAINST('或访问' IN BOOLEAN MODE); 93 94SELECT * FROM articles WHERE 95 MATCH(title, body) AGAINST('"数据的结构化"' IN BOOLEAN MODE); 96 97SET DEBUG="-d,fts_instrument_ignore_ngram_check"; 98 99DROP TABLE articles; 100 101# With Stopwords 102CREATE TABLE articles ( 103 id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, 104 title VARCHAR(200), 105 body TEXT 106 ) ENGINE=InnoDB DEFAULT CHARACTER SET gb2312 COLLATE gb2312_chinese_ci; 107 108# Define a user stopword table and set to it 109CREATE TABLE user_stopword(value varchar(30)) ENGINE = InnoDB 110 DEFAULT CHARACTER SET gb2312 COLLATE gb2312_chinese_ci; 111 112INSERT INTO user_stopword VALUES('的'),('或'),('东西'),('ab'); 113 114SET GLOBAL innodb_ft_server_stopword_table = 'test/user_stopword'; 115 116INSERT INTO articles (title, body) VALUES 117 ('从简单购物清单到画展','或企业网络中的海量数据'), 118 ('要想将数据添加到数据库','访问、处理计算机数据库中保存的数据'); 119 120CREATE FULLTEXT INDEX ft_index ON articles(title, body) WITH PARSER ngram; 121 122INSERT INTO articles (title, body) VALUES 123 ('从简单的购物清单到画展','或企业网络中的海量数据'), 124 ('要想将数据添加到数据库','或访问、处理计算机数据库中保存的数据'), 125 ('要想将数据添加到数据库','或访问、处理计算机数据库中保存的数据 abc xyz'), 126 ('数据库是数据的结构化集合','它可以是任何东西'); 127 128SELECT * FROM articles WHERE 129 MATCH(title, body) AGAINST('的* 或* 东西' IN BOOLEAN MODE); 130 131SELECT * FROM articles WHERE 132 MATCH(title, body) AGAINST('简单的' IN BOOLEAN MODE); 133 134SELECT * FROM articles WHERE 135 MATCH(title, body) AGAINST('或访问' IN BOOLEAN MODE); 136 137SELECT * FROM articles WHERE 138 MATCH(title, body) AGAINST('"数据的结构化"' IN BOOLEAN MODE); 139 140SELECT * FROM user_stopword WHERE value like 'ab' ; 141SELECT * FROM articles WHERE 142 MATCH(title, body) AGAINST('"ab"' ); 143SELECT * FROM articles WHERE 144 MATCH(title, body) AGAINST('数据 +ab' IN BOOLEAN MODE); 145SELECT * FROM articles WHERE 146 MATCH(title, body) AGAINST('数据 (+xyz -bc)' IN BOOLEAN MODE); 147 148DROP TABLE user_stopword; 149DROP TABLE articles; 150SET GLOBAL innodb_ft_server_stopword_table=default; 151 152-- echo # Test Case 3: Check with FTS debug points 153CREATE TABLE articles ( 154 seq INT AUTO_INCREMENT NOT NULL PRIMARY KEY, 155 c1 VARCHAR(200) CHARACTER SET big5 COLLATE big5_chinese_ci, 156 c2 CHAR(200) CHARACTER SET gbk COLLATE gbk_chinese_ci, 157 c3 CHAR(200) CHARACTER SET utf8, 158 j1 TEXT CHARACTER SET ujis COLLATE ujis_japanese_ci, 159 j2 VARCHAR(200) CHARACTER SET sjis COLLATE sjis_japanese_ci, 160 j3 VARCHAR(200) CHARACTER SET ujis, 161 k1 CHAR(200) CHARACTER SET euckr COLLATE euckr_korean_ci, 162 k2 CHAR(200) CHARACTER SET utf8, 163 e1 CHAR(200) CHARACTER SET latin1, 164 FULLTEXT KEY `con1` (c1), 165 FULLTEXT KEY `con2` (j1,j3), 166 FULLTEXT KEY `con3` (k2) WITH PARSER ngram 167 ) ENGINE=InnoDB ; 168SET DEBUG='+d,alter_table_rollback_new_index'; 169-- error ER_UNKNOWN_ERROR 170ALTER TABLE articles ADD FULLTEXT INDEX (c2(64)); 171-- error ER_UNKNOWN_ERROR 172ALTER TABLE articles ADD FULLTEXT INDEX (j1,j3); 173-- error ER_UNKNOWN_ERROR 174ALTER TABLE articles ADD FULLTEXT INDEX (k1); 175-- error ER_UNKNOWN_ERROR 176ALTER TABLE articles ADD FULLTEXT INDEX (e1); 177SET DEBUG='-d,alter_table_rollback_new_index'; 178 179# Abort the operation in dict_create_index_step by setting 180# return status of dict_create_index_tree_step() to DB_OUT_OF_MEMORY 181# The newly create dict_index_t should be removed from fts cache 182SET DEBUG="+d,ib_dict_create_index_tree_fail"; 183--error ER_OUT_OF_RESOURCES 184ALTER TABLE articles ADD FULLTEXT INDEX (c2(64)); 185--error ER_OUT_OF_RESOURCES 186ALTER TABLE articles ADD FULLTEXT INDEX (j1,j3); 187--error ER_OUT_OF_RESOURCES 188ALTER TABLE articles ADD FULLTEXT INDEX (k1); 189--error ER_OUT_OF_RESOURCES 190ALTER TABLE articles ADD FULLTEXT INDEX (e1); 191SET DEBUG="-d,ib_dict_create_index_tree_fail"; 192 193--error ER_INNODB_FT_LIMIT 194ALTER TABLE articles ADD FULLTEXT INDEX (e1), ADD FULLTEXT INDEX (k1); 195DROP TABLE articles; 196 197SET GLOBAL innodb_ft_enable_diag_print = default; 198