先建表添加数据再添加索引效率会更快
建表语句 fulltext是指定要检索的列 可以指定多列后续也可以添加要检索的列
drop table if exists test;
create table test (
id integer not null primary key auto_increment,
body longtext,
fulltext( body) with parser ngram
);
with parser ngram作用是指定分词引擎
建表后添加需要全文检索的字段
ALTER TABLE food ADD FULLTEXT (dish,chef) with parser ngram;
请注意,(dish,chef)它将作为一对。这意味着您只能同时在两个字段上使用全文查询,而不能在任何一个字段上使用。您需要单独指定它们以便独立索引它们。同样,如果您单独索引它们,则不能与多个列进行全文匹配。
使用navicat建立全文索引 指定索引类型 指定解析器用于分词
Mysql8支持三中全文检索
Match是要匹配的列 against是要进行检索的字段
自然语言全文搜索
语法 select * from test where match( body) against ('英语语文' in natural language mode);
其中body为要进行检索字段 英语语文是要检索的内容 只要包含两个连续的字 比如英语 语语 都可以被检索到
布尔全文搜索
SELECT * FROM test WHERE MATCH(body) AGAINST ('+只有 -文2' IN BOOLEAN MODE);
+后面的字段代表应该出现在结果里 -后面的字段代表不应该出现在结果里
查询扩展搜索
SELECT * FROM test WHERE MATCH(body) AGAINST ('11' WITH QUERY EXPANSION);
大概就是进行两次搜索 第一次搜索与11匹配的字段 第二次再根据搜索出来的结果再进行搜索
例根据11搜索出的结果
查询扩展搜索出来的结果
使全文检索检索字符粒度最小,在my.ini文件添加如下配置并重启mysql并重新建立索引
设置默认的最小索引的长度
ft_min_word_len = 1
设置为要查询的单词的最小字数也就是词的大小
ngram_token_size = 1
一般来说,查询正好等于ngram_token_size的词,速度会更快,但是查询比它更长的词或短语,则会变慢