1、MySQL全文索引
MySQL中的全文索引是类型的索引 FULLTEXT。全文索引只能使用 InnoDB或 MyISAM表格,并且只能用于创建CHAR, VARCHAR或 TEXT列。
FULLTEXT索引可以在CREATE TABLE创建表时被定义,也可以稍后使用添加 ALTER TABLE或 CREATE INDEX添加。但对于大型数据集,将数据加载到没有FULLTEXT索引的表中,然后在此之后创建索引要快得多,而不是将数据加载到具有现有FULLTEXT索引的表中。
使用MATCH() … AGAINST语法执行全文搜索 。 MATCH()采用逗号分隔的列表来命名要搜索的列。 AGAINST获取要搜索的字符串,以及指示要执行的搜索类型的可选修饰符。搜索字符串必须是在查询评估期间保持不变的字符串值。
2、全文索引类型:
(1)自然语言全文索引
将搜索字符串解释为自然人类语言(自由文本中的短语)中的短语。没有特殊运算符,但双引号(“)字符除外。存在停用词列表。
如果给出IN NATURAL LANGUAGE MODE修饰符或者没有修饰符,则全文搜索是自然语言搜索 。
(2)布尔全文索引
使用特殊查询语言的规则来解释搜索字符串。该字符串包含要搜索的单词。它还可以包含指定要求的运算符,以便在匹配的行中必须存在或不存在单词,或者它应该比通常更高或更低的权重。搜索索引中省略了某些常用词(停用词),如果搜索字符串中存在,则不匹配。该IN BOOLEAN MODE修饰符指定一个布尔搜索。
(3)查询扩展全文索引
是自然语言搜索的修改。搜索字符串用于执行自然语言搜索。然后将搜索返回的最相关行中的单词添加到搜索字符串中,然后再次进行搜索。查询返回第二次搜索中的行。该IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION或WITH QUERY EXPANSION修改指定查询扩展搜索。
3、自然语言全文索引
默认情况,或着使用IN NATURAL LANGUAGE MODE修饰符, MATCH()函数会针对FULLTEXT索引中包含的一个或多个列的集合执行字符串的自然语言搜索 。搜索字符串作为参数给出AGAINST()。对于表中的每一行,MATCH()返回相关值; 也就是说,搜索字符串与MATCH()列表中指定的列中该行中的文本之间的相似性度量。
mysql> CREATE TABLE articles (
-> id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
-> title VARCHAR(200),
-> body TEXT,
-> FULLTEXT (title,body)
-> ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.46 sec)
mysql> INSERT INTO articles (title,body) VALUES
-> ('MySQL Tutorial','DBMS stands for DataBase ...'),
-> ('How To Use MySQL Well','After you went through a ...'),
-> ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
-> ('MySQL vs. YourSQL','In the following database comparison ...'),
-> ('MySQL Security','When configured properly, MySQL ...');
Query OK, 6 rows affected (0.01 sec)
Records: 6 Duplicates: 0 Warnings: 0
mysql> select * from articles;
+----+-----------------------+------------------------------------------+
| id | title | body |
+----+-----------------------+------------------------------------------+
| 1 | MySQL Tutorial | DBMS stands for DataBase ... |
| 2 | How To Use MySQL Well | After you went through a ... |
| 3 | Optimizing MySQL | In this tutorial we will show ... |
| 4 | 1001 MySQL Tricks | 1. Never run mysqld as root. 2. ... |
| 5 | MySQL vs. YourSQL | In the following database comparison ... |
| 6 | MySQL Security | When configured properly, MySQL ... |
+----+-----------------------+------------------------------------------+
6 rows in set (0.00 sec)
mysql> SELECT * FROM articles
-> WHERE MATCH (title,body)
-> AGAINST ('database' IN NATURAL LANGUAGE MODE); //不加修饰符时,像这样AGAINST ('DATABASE');为默认
+----+-------------------+------------------------------------------+
| id | title | body |
+----+-------------------+------------------------------------------+
| 1 | MySQL Tutorial | DBMS stands for DataBase ... |
| 5 | MySQL vs. YourSQL | In the following database comparison ... |
+----+-------------------+------------------------------------------+
2 rows in set (0.00 sec)
//默认情况下,搜索以不区分大小写的方式执行
对于自然语言全文搜索,MATCH()函数中指定的列必须与表中某些FULLTEXT索引中包含的列相同。像下面我们如果要单独搜索title或 body会报错,可以使用FULLTEXT为每列创建单独的索引。
mysql> SELECT * FROM articles WHERE MATCH (body) AGAINST ('DATABASE' IN NATURAL LANGUAGE MODE);
ERROR 1191 (HY000): Can't find FULLTEXT index matching the column list
当MATCH()在WHERE子句中使用时 ,如前面所示的示例中所示,返回的行将首先自动排序,具有最