>## 修改表结构使⽤如下格式 >###ALTER TABLE table_name ADD FULLTEXT INDEX index_name(column_name1,column_name2);
3.2 查询⽅式
⾃然语⾔模式 ( IN NATURAL LANGUAGEMODE )
遵从⾃然语⾔分词规则,匹配完整的单词,查询关键字也会根据分词规则⾃动分词,只要匹配分词后的各个单词中其中任意⼀个便可以查询到记录,默认就是这种模式 少林传人
where条件后接MATCH(column_name1,column_name2) AGAINST('keyword')
#或者
where条件后接MATCH(column_name1,column_name2) AGAINST('keyword'IN NATURAL LANGUAGE MODE)
eg1. MATCH(food_name) AGAINST(‘apple’) 可以匹配出 apple,apples,Apples 等完整单词
eg2. MATCH(food_name) AGAINST(‘apple orange’) 可以匹配出 apple,apples,Apples 、orange、oranges、
Oranges等完整单词
布尔全⽂搜索 ( IN BOOLEAN MODE )
如果在AAGAINST()函数中指定了IN BOOLEN MODE模式,则MySQL会执⾏布尔全⽂搜索。在该搜索模式下,待搜索单词前或后的⼀些特定字符会有特殊的含义。
where条件后接MATCH(column_name1,column_name2) AGAINST('keyword'IN BOOLEAN MODE)
BOOLEAN 模式操作符使⽤说明
符号功能描述
+符号后⾯接的单词必须要在搜索结果⾥
-符号后⾯接的单词必须不能出现在搜索结果⾥
<;符号后⾯接的单词匹配优先级低⼀些
外汇百科>符号后⾯接的单词匹配优先级⾼⼀些
()⽤于匹配表达式中的⼀组单词
~可选,相关性级别低的词,匹配后排名会相对靠后
*通配符,跟在词的后⾯,进⾏模糊检索
"双引号间的内容进⾏全词匹配(引号间的内容不会被分词),适合短语和⼦句的匹配,遵循最左匹配原则
符号功能描述
布尔全⽂搜索⽰例
eg1. MATCH(food_name) AGAINST(’+apple-orange’) 可以匹配出 包含apple,apples,Apples 等单词,并不包含orange、oranges、Oranges等单词的记录
eg2.MATCH(food_name) AGAINST(’“apple orange”’) 可以匹配出 包含apple-orange字句的记录
3.3 多列索引和单列索引
对于普通的索引,如果建⽴了(column_name1,column_name2)的联合索引,就不必单独建⽴ column_name1和 column_name2的索引,也可以搜索单列。但是全⽂索引就不⾏,索引的列必须和查询的列完全⼀致。如果查询 column_name1,就要建⽴column_name1单列的全⽂索引;如果查询 (column_name1, column_name2) 就要建⽴只包含 (column_name1,
column_name2) 两列的索引。
4、全⽂索引如何⽀持中⽂分词
MySQL需要开启ngram插件青潮
MySQL 5.7开始,MySQL内置了ngram全⽂检索插件
使⽤索引
alter table table1 add fulltext index idx_ft_test(clumn1,clumn2)with parser ngram;
当然也可以在建表时指定索引
CREATE TABLE table1(
id INTUNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
name VARCHAR(200),
love_foodsTEXT,
FULLTEXT key(name,love_foods)WITH PARSER ngram
)ENGINE=InnoDB CHARACTER SET utf8mb4;
MariaDB创建表时指定使⽤mroonga存储引擎即可
create table table1 (
id int not null,
name varchar(100)not null,
love_foods text,
fulltext key idx_ft_love_foods(love_foods)
)engine=mroonga;
5、全⽂索引使⽤⽰例,以MariaDB为例
5.1 创建表和索引
CREATE TABLE ft_myisam(copy TEXT,FULLTEXT(copy)) ENGINE=MyISAM;
INSERT INTO ft_myisam(copy) VALUES ('Once upon a time'),
('There was a wicked witch'), ('Who ate everybody up');
SELECT * FROM ft_myisam WHERE MATCH(copy) AGAINST('wicked');
+--------------------------+
| copy |
+--------------------------+
| There was a wicked witch |
+--------------------------+
多个单词的情况:
SELECT*FROM ft_myisam WHERE MATCH(copy) AGAINST('wicked,witch');
+---------------------------------+
| copy |
+---------------------------------+
| There was a wicked witch |
刘湖+---------------------------------+
如果关键字未到,则返回空
SELECT*FROM ft_myisam WHERE MATCH(copy) AGAINST('Once');
Empty set(0.00 sec)
如果匹配了超过50%的记录,返回空
INSERT INTO ft_myisam(copy)VALUES('Once upon a wicked time'),
('There was a wicked wicked witch'),('Who ate everybody wicked up');
SELECT*FROM ft_myisam WHERE MATCH(copy) AGAINST('wicked');
Empty set(0.00 sec)
5.2 使⽤IN BOOLEAN MODE模式来解决满⾜条件的记录占⽐超过50%的情况
SELECT*FROM ft_myisam WHERE MATCH(copy) AGAINST('wicked'IN BOOLEAN MODE); +---------------------------------+
| copy |
+---------------------------------+
| There was a wicked witch |
| Once upon a wicked time|
| There was a wicked wicked witch |
| Who ate everybody wicked up |
+---------------------------------+
返回了如下结果:
SELECT copy,MATCH(copy) AGAINST('witch')AS relevance
FROM ft_myisam WHERE MATCH(copy) AGAINST('witch');
+---------------------------------+--------------------+
| copy | relevance |
+---------------------------------+--------------------+
| There was a wicked witch |0.6775632500648499|
| There was a wicked wicked witch |0.5031757950782776|
+---------------------------------+--------------------+
5.3 IN BOOLEAN MODE模式的操作符使⽤说明与⽰例