理解全文搜索
前面我们已经了解过基于LIKE
关键字的搜索,它利用通配操作符匹配文本。使用LIKE,能够查找包含特殊值或部分值得行。使用正则表达式,可以编写查找所需行得非常浮渣得匹配模式。
虽然这些搜索机制非常有用,但存在几个重要的限制:
- 性能——通配符和正则表达式匹配通常要求MySQL尝试匹配表中所有行(而且这些搜索极少使用表索引)。因此,由于被搜索行数不断增加,这些搜索可能非常耗时。
- 明确控制——使用通配符和正则表达式匹配,很难(而且并不总是能)明确地控制匹配什么和不匹配什么。例如,指定一个词必须匹配,一个词必须不匹配,而一个词仅在第一个词确实匹配得情况下才可以匹配或者才可以不匹配。
- 智能化的结果——虽然基于通配符和正则表达式的搜索提供了非常灵活的搜索,但它们都不能提供一种智能化的选择结果的方法。例如,一个特殊词的匹配将会返回包含该词的所有行,而不区分包含单个匹配的行和包含多个匹配的行。
所有这些限制以及更多的限制都可以通过全文本搜索来解决。在使用全文本搜索时,MySQL不需要分别查看每个行,不需要分别分析和处理每个词。MySQL创建指定列中各词的一个索引,搜索可以针对这些词进行。这样,MySQL可以快速有效的决定哪些词匹配,哪些词不匹配,它们的频率,等等。
使用全文本搜索
为了进行全文本搜索,必须索引被搜索的列,而且要随着数据的改变不断地重新索引。在对表进行适当设计后,MySQL会自动进行所有的索引和重新索引。
在索引之后,SELECT
与Match()
和Against()
一起使用以实际执行搜索。
启用全文本搜索支持
一般在创建表时启用全文本搜索支持。CREATE TABLE
语句接受FULL TEXT
子句,它给出被索引的一个逗号分隔的列表。
mysql> SELECT note_text FROM productnotes WHERE Match(note_text) Against ('rabbit');
+----------------------------------------------------------------------------------------------------------------------+
| note_text |
+----------------------------------------------------------------------------------------------------------------------+
| Customer complaint: rabbit has been able to detect trap, food apparently less effective now. |
| Quantity varies, sold by the sack load.
All guaranteed to be bright and orange, and suitable for use as rabbit bait. |
+----------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
!传递给Match()的值必须与FULLTEXT()定义中的相同。如果指定多个列,则必须列出他们。
!搜索不区分大小写,除非使用BINARY方式。
mysql> SELECT note_text FROM productnotes WHERE note_text LIKE "%rabbit%";
+----------------------------------------------------------------------------------------------------------------------+
| note_text |
+----------------------------------------------------------------------------------------------------------------------+
| Quantity varies, sold by the sack load.
All guaranteed to be bright and orange, and suitable for use as rabbit bait. |
| Customer complaint: rabbit has been able to detect trap, food apparently less effective now. |
+--------------