+++++++++++++开始线++++++++++++++++
一、 理解全文本搜索
几个重要的限制:
1.性能:通配符和正则表达式匹配通常要求MySQL尝试匹配表中所有行。因此,由于被搜索行数不断增加,这些搜索可能非常耗时
2.明确控制:使用通配符和正则表达式匹配,很难明确地控制匹配什么和不匹配什么
3.智能化的结果:虽然基于通配符和正则表达式的搜索提供了非常灵活的搜索,但它们都不能提供一种智能化的选择结果的方法
二、 使用全文本搜索
为了进行全文本搜索,必须索引被搜索的列,而且要随着数据的改变不断地重新索引。在对表列进行适当设计后,MySQL会自动进行所有的索引和重新索引。
在索引之后,SELECT可与Match()和Against()一起使用以实际执行搜索。
2.1启用全文本搜索支持
一般在创建表时启用全文本搜索。CREATE TABLE接受FULLTEXT子句,它给出被索引列的一个逗号分隔的列表
mysql> CREATE TABLE productnotes
-> (
-> note_id int NOT NULL AUTO_INCREMENT,
-> prod_id char(10) NOT NULL,
-> note_date datetime NOT NULL,
-> note_text text NULL,
-> PRIMARY KEY(note_id),
-> FULLTEXT(note_text)
-> )ENGINE=MyISAM;
不要再导入数据时使用FULLTEXT
更新索引要花时间,虽然不是很多,但毕竟要花时间。应该首先导入所有数据,然后再修改表,再定义FULLTEXT。
2.2 进行全文本搜索
Match()指定被搜索的列,Against()指定要使用的搜索表达式
mysql> SELECT note_text
-> FROM productnotes
-> WHERE Match(note_text) Against('rabbit');
使用完整的Match()说明
传递给Match()的值必须与FULLTEXT()定义中的相同。如果指定多个列,则必须列出它们并且次序正确
上个例子也可以简单地用LIKE子句完成
mysql> SELECT note_text
-> FROM productnotes
-> WHERE note_text LIKE '%rabbit%';
2.4 布尔文本搜索
MySQL支持全文本搜索的另外一种形式,称为布尔方式
mysql> SELECT note_text
-> FROM productnotes
-> WHERE Match(note_text) Against('heavy' IN BOOLEAN MODE);
匹配包含heavy但不包含任意以rope的开始的词的行
mysql> SELECT note_text
-> FROM productnotes
-> WHERE Match(note_text) Against('heavy -rope*' IN BOOLEAN MODE);
搜索包含rabbit和bait的行
mysql> SELECT note_text
-> FROM productnotes
-> WHERE Match(note_text) Against('+rabbit +bait' IN BOOLEAN MODE);
没有指定操作符,这个搜索匹配包含rabbit和bait中的至少一个词的行
mysql> SELECT note_text
-> FROM productnotes
-> WHERE Match(note_text) Against('rabbit bait' IN BOOLEAN MODE);
匹配短语rabbit bait
mysql> SELECT note_text
-> FROM productnotes
-> WHERE Match(note_text) Against('"rabbit bait"'IN BOOLEAN MODE);
匹配rabbit和carrot,增加前者的等级,降低后者的等级
mysql> SELECT note_text
-> FROM productnotes
-> WHERE Match(note_text) Against('>rabbit <carrot' IN BOOLEAN MODE);
2.5 全文本搜索的使用说明
1.在索引全文本数据时,短词被忽略且从索引中排除
2.MySQL带有一个内建的非用词列表,这些词在索引全文本数据时总是被忽略
3.如果表中的行数小于3行,则全文本搜索不返回结果
4.忽略词中的单引号
5.仅在MyISAM数据库引擎中支持全文本搜索
+++++++++++++结束线++++++++++++++++