FULL TEXT索引 Mysql 3.23.23以及更高版本支持一种特殊类型的索引 全文索引在 MySQL 中是一个 全文索引在 MySQL 中是一个 FULLTEXT
类型索引。FULLTEXT
索引用于 MyISAM
表(且仅支持该类型的表),可以在 CREATE TABLE
时或之后使用 ALTER TABLE
或 CREATE INDEX
在 CHAR
、VARCHAR
或 TEXT
列上创建。对于大的数据库,将数据装载到一个没有 FULLTEXT
索引的表中,然后再使用 ALTER TABLE
(或 CREATE INDEX
) 创建索引,这将是非常快的。将数据装载到一个已经有 FULLTEXT
索引的表中,将是非常慢的。
全文搜索通过 MATCH()
函数完成。
mysql> CREATE TABLE articles ( -> id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, -> title VARCHAR(200), -> body TEXT, -> FULLTEXT (title,body) -> ); Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO articles VALUES -> (NULL,'MySQL Tutorial', 'DBMS stands for DataBase ...'), -> (NULL,'How To Use MySQL Efficiently', 'After you went through a ...'), -> (NULL,'Optimising MySQL','In this tutorial we will show ...'), -> (NULL,'1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'), -> (NULL,'MySQL vs. YourSQL', 'In the following database comparison ...'), -> (NULL,'MySQL Security', 'When configured properly, MySQL ...'); Query OK, 6 rows affected (0.00 sec) Records: 6 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM articles -> WHERE MATCH (title,body) AGAINST ('database'); +----+-------------------+------------------------------------------+ | id | title | body | +----+-------------------+------------------------------------------+ | 5 | MySQL vs. YourSQL | In the following database comparison ... | | 1 | MySQL Tutorial | DBMS stands for DataBase ... | +----+-------------------+------------------------------------------+ 2 rows in set (0.00 sec) 函数MATCH()
对照一个文本集(包含在一个FULLTEXT
索引中的一个或多个列的列集)执行一个自然语言搜索一个字符串。搜索字符串做为AGAINST()
的参数被给定。搜索以忽略字母大小写的方式执行。对于表中的每个记录行,MATCH()
返回一个相关性值。即,在搜索字符串与记录行在MATCH()
列表中指定的列的文本之间的相似性尺度。 如果即没有WHERE
也没有ORDER BY
子句,返回行是不排序的。 下一个示例显示如何检索一个明确的相似性值mysql> SELECT id,MATCH (title,body) AGAINST ('Tutorial') FROM articles; +----+-----------------------------------------+ | id | MATCH (title,body) AGAINST ('Tutorial') | +----+-----------------------------------------+ | 1 | 0.64840710366884 | | 2 | 0 | | 3 | 0.66266459031789 | | 4 | 0 | | 5 | 0 | | 6 | 0 | +----+-----------------------------------------+ 6 rows in set (0.00 sec)
到 4.0.1 时,MySQL 也可以使用
IN BOOLEAN MODE
修饰语来执行一个逻辑全文搜索。mysql> SELECT * FROM articles WHERE MATCH (title,body) -> AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE); +----+------------------------------+-------------------------------------+ | id | title | body | +----+------------------------------+-------------------------------------+ | 1 | MySQL Tutorial | DBMS stands for DataBase ... | | 2 | How To Use MySQL Efficiently | After you went through a ... | | 3 | Optimising MySQL | In this tutorial we will show ... | | 4 | 1001 MySQL Tricks | 1. Never run mysqld as root. 2. ... | | 6 | MySQL Security | When configured properly, MySQL ... | +----+------------------------------+-------------------------------------+
这个查询返回所有包含词
MySQL
的记录行(注意: 50% 的阈值没有使用),但是它没有包含词YourSQL
。注意,一个逻辑模式的搜索不会自动地以相似值的降序排序记录行。你可以从上面的结果出看得出来,最高的相似值(包含MySQL
两次的那个) 最列在最后,而不是第一位。一个逻辑全文搜索即使在没有一个FULLTEXT
索引的情况下也可以工作,然而它 慢 些。逻辑全文搜索支持下面的操作符:
+
- 一个领头的加号表示,该词必须出现在每个返回的记录行中。
-
- 一个领头的减号表示,该词必须不出现在每个返回的记录行中。
-
缺省的 (当既没有加号也没有负号被指定时)词是随意的,但是包含它的记录行将被排列地更高一点。这个模仿没有
IN BOOLEAN MODE
修饰词的MATCH() ... AGAINST()
的行为。 < >
-
这两个操作符用于改变一个词的相似性值的基值。
<
操作符减少基值,>
操作符则增加它。参看下面的示例。 ( )
- 圆括号用于对子表达式中的词分组。
~
-
一个领头的否定号的作用象一个否定操作符,引起行相似性的词的基值为负的。它对标记一个噪声词很有用。一个包含这样的词的记录将被排列得低一点,但是不会被完全的排除,因为这样可以使用
-
操作符。 *
- 一个星号是截断操作符。不想其它的操作符,它应该被追加到一个词后,不加在前面。
"
- 短语,被包围在双引号
"
中,只匹配包含这个短语(字面上的,就好像被键入的)的记录行。
这里是一些示例:
apple banana
- 找至少包含上面词中的一个的记录行
+apple +juice
- ... 两个词均在被包含
+apple macintosh
- ... 包含词 “apple”,但是如果同时包含 “macintosh”,它的排列将更高一些
+apple -macintosh
- ... 包含 “apple” 但不包含 “macintosh”
+apple +(>pie <strudel)
- ... 包含 “apple” 和 “pie”,或者包含的是 “apple” 和 “strudel” (以任何次序),但是 “apple pie” 排列得比 “apple strudel” 要高一点
apple*
- ... 包含 “apple”,“apples”,“applesauce” 和 “applet”
"some words"
- ... 可以包含 “some words of wisdom”,但不是 “some noise words”