<n=1: '生', '日', '快', '乐' n=2: '生日', '日快', '快乐' n=3: '生日快', '日快乐' n=4: '生日快乐'mysqld --ngram_token_size=2[mysqld]ngram_token_size=2CREATE TABLE articles (id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,title VARCHAR (200),body TEXT,FULLTEXT (title, body) WITH PARSER ngram) ENGINE = INNODB;ALTER TABLE articles ADD FULLTEXT INDEX ft_index (title,body) WITH PARSER ngram;CREATE FULLTEXT INDEX ft_index ON articles (title,body) WITH PARSER ngram;SELECT * FROM articlesWHERE MATCH (title,body)AGAINST ('一路 一带' IN NATURAL LANGUAGE MODE);// 不指定模式,默认使用自然语言模式SELECT * FROM articlesWHERE MATCH (title,body)AGAINST ('一路 一带');// 获取相关性的值SELECT id,title,MATCH (title,body) AGAINST ('手机' IN NATURAL LANGUAGE MODE) AS scoreFROM articlesORDER BY score DESC;// 获取匹配结果记录数SELECT COUNT(*) FROM articlesWHERE MATCH (title,body)AGAINST ('一路 一带' IN NATURAL LANGUAGE MODE);// 必须包含"腾讯"SELECT * FROM articlesWHERE MATCH (title,body)AGAINST ('+腾讯' IN BOOLEAN MODE);// 必须包含"腾讯",但是不能包含"通讯工具"SELECT * FROM articlesWHERE MATCH (title,body)AGAINST ('+腾讯 -通讯工具' IN BOOLEAN MODE);'apple banana' 无操作符,表示或,要么包含apple,要么包含banana'+apple +juice'必须同时包含两个词'+apple macintosh'必须包含apple,但是如果也包含macintosh的话,相关性会更高。'+apple -macintosh'必须包含apple,同时不能包含macintosh。'+apple ~macintosh'必须包含apple,但是如果也包含macintosh的话,相关性要比不包含macintosh的记录低。'+apple +(>juice>
只能在类型为CHAR、VARCHAR或者TEXT的字段上创建全文索引。
全文索引只支持InnoDB和MyISAM引擎。
MATCH (columnName) AGAINST ('keywords')。MATCH()函数使用的字段名,必须要与创建全文索引时指定的字段名一致。如上面的示例,MATCH (title,body)使用的字段名与全文索引ft_articles(title,body)定义的字段名一致。如果要对title或者body字段分别进行查询,就需要在title和body字段上分别创建新的全文索引。
MATCH()函数使用的字段名只能是同一个表的字段,因为全文索引不能够跨多个表进行检索。
如果要导入大数据集,使用先导入数据再在表上创建全文索引的方式要比先在表上创建全文索引再导入数据的方式快很多,所以全文索引是很影响TPS的。