在MySQL 5.7.6之前,全文索引只支持英文全文索引,不支持中文全文索引,需要利用分词器把中文段落预处理拆分成单词,然后存入数据库。
从MySQL 5.7.6开始,MySQL内置了ngram全文解析器,用来支持中文、日文、韩文分词。
本文使用的是MySQL 5.7.25
MyISAM数据引擎 innodb支持事务,myisam不支持
本人因其他条件原因,无法改为innodb数据引擎,建议用innodb
本文使用的Navicat Preminum 可视化数据库操作软件
ngram全文解析器
ngram就是一段文字里面连续的n个字的序列。ngram全文解析器能够对文本进行分词,每个单词是连续的n个字的序列。例如,用ngram全文解析器对“我爱我的祖国”进行分词:n=1: '我', '爱', '我', '的' ,'祖', '国'
n=2: '我爱', '我的', '祖国'
n=3: '我爱我', '的祖国'
n=4: 。。。
MySQL 中使用全局变量ngram_token_size来配置ngram中n的大小,它的取值范围是1到10,默认值是2。通常ngram_token_size设置为要查询的单词的最小字数。如果需要搜索单字,就要把ngram_token_size设置为1。在默认值是2的情况下,搜索单字是得不到任何结果的。因为中文单词最少是两个汉字,推荐使用默认值2。
查看命令:SHOW VARIABLES LIKE 'ngram%';
下面我们开始主题;
CREATE TABLE fb_document (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR (200),
keyword TEXT,
FULLTEXT (title, keyword) WITH PARSER ngram
) ENGINE = MYISAM;
如果你的数据表已经创建;ALTER TABLE fb_document ADD FULLTEXT INDEX fb_index (title,keyword) WITH PARSER ngram;
居然报错:[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause
show variables like "sql_mode";
set sql_mode='';
set sql_mode='NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES';
终于可以了,然后在程序中;$title='我爱我的祖国';
select id from fb_document where MATCH(title,keyword) AGAINST('".$title."' IN BOOLEAN MODE);
常用的全文检索模式有两种:
1、自然语言模式(NATURAL LANGUAGE MODE) ,
自然语言模式是MySQL 默认的全文检索模式。自然语言模式不能使用操作符,不能指定关键词必须出现或者必须不能出现等复杂查询。
2、BOOLEAN模式(BOOLEAN MODE)
BOOLEAN模式可以使用操作符,可以支持指定关键词必须出现或者必须不能出现或者关键词的权重高还是低等复杂查询。
本人实测,经验有限,虽然可以成功的搜索到内容,但是效果不太理想