Mysql(5.6.4版本以上)的Innodb引擎默认是支持全文检索的,但只支持英文。
一般利用关联数组,在辅助表中存储单词与文档中所在位置的映射。如下图:
创建表和插入数据:
CREATE TABLE test(
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT (title,body)
) ENGINE=InnoDB;
INSERT INTO `lianyp`.`test`(`id`, `title`, `body`) VALUES (1, 'Two wives', 'one funeral, no tears.');
INSERT INTO `lianyp`.`test`(`id`, `title`, `body`) VALUES (2, 'Disputes between nations', 'Sorrow among families.');
INSERT INTO `lianyp`.`test`(`id`, `title`, `body`) VALUES (3, 'Love lasts forever', 'life runs out');
INSERT INTO `lianyp`.`test`(`id`, `title`, `body`) VALUES (4, 'I love him', 'he doesn\'t know');
INSERT INTO `lianyp`.`test`(`id`, `title`, `body`) VALUES (5, 'Strangers. Friends', 'Best friends. Lovers. Strangers.');
INSERT INTO `lianyp`.`test`(`id`, `title`, `body`) VALUES (6, 'The literary magazine has revealed', 'its once-a-decade list of the 20 most promising British writers under');
INSERT INTO `lianyp`.`test`(`id`, `title`, `body`) VALUES (7, '中文', '中文字符');
INSERT INTO `lianyp`.`test`(`id`, `title`, `body`) VALUES (8, '中国人', '中国文字');
INSERT INTO `lianyp`.`test`(`id`, `title`, `body`) VALUES (9, '输入 法', '搜狗 拼音');
INSERT INTO `lianyp`.`test`(`id`, `title`, `body`) VALUES (10, '输入 法', '搜狗 拼音');
INSERT INTO `lianyp`.`test`(`id`, `title`, `body`) VALUES (11, '输入法', '搜狗拼音');
MySQL支持三种模式的全文检索,自然语言模式、布尔模式和查询扩展模式。
1、自然语言模式
将搜索字符串解释为自然人类语言,除双引号外,没有特殊的运算符
未指定查询模式或指定为 IN NATURAL LANGUAGE MODE,都表示自然语言搜索
SELECT * ,MATCH (title, body) AGAINST ('love') FROM test where
MATCH (title, body) AGAINST ('love');
MATCH (title, body) AGAINST ('love')为搜索结果的相关性
查询结果就是取相关性>0的记录。那相关性是怎么计算呢?
1.word(查询关键字)是否在文档中出现
2.word在文档中出现的次数
3.word在索引列中的数量
4.多少个文档包含该word
Love lasts forever 出现了一次
I love him 出现了一次
2.布尔模式
使用特殊规则解释搜索字符串。该字符串包含要搜索的单词,还可以包含指定要求的运算符
查询模式 IN BOOLEAN MODE 表示布尔搜索(用+,-符号,分别表示一定存在,和一定不存在)
SELECT * FROM test WHERE MATCH (title, body) AGAINST ('+love -him' IN BOOLEAN MODE);
3.查询扩展模式
是对自然语言搜索的修改。搜索字符串用于执行自然语言搜索,将搜索返回的最相关行中的单词添加到搜索字符串中,然后 再次执行搜索
SELECT * FROM test WHERE MATCH (title, body) AGAINST ('him' WITH QUERY EXPANSION);
根据him查找出love相关的记录
4.分词:
在使用MySQL全文索引时,会发现有些单词检索不出结果,如about、at、as等,这些不能索引查询的词,比如'to',这称之为stopword;
查询系统中的stopword
select * from information_schema.INNODB_FT_DEFAULT_STOPWORD;
也可以定制stopword,可以参考mysql stopwords
有一些词没在stopword里,但是也无法检索,这是因为word的字符长度有限制
查询系统中检索长度限制:
SHOW VARIABLES LIKE 'innodb_ft%';
可以难道检索的长度为3-84个字符
查看test表的分词记录
SET GLOBAL innodb_ft_aux_table="lianyp/test";
SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE;