mysql全文索引查英文_mysql的全文索引你真的了解么

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;

你可能感兴趣的:(mysql全文索引查英文)