全文索引在 MySQL 中是一个 FULLTEXT 类型索引。FULLTEXT 索引用于 MyISAM 表,可以在 CREATE TABLE 时或之后使用 ALTER TABLE 或 CREATE INDEX 在 CHAR、VARCHAR 或 TEXT 列上创建。对于大的数据库,将数据装载到一个没有 FULLTEXT 索引的表中,然后再使用 ALTER TABLE (或 CREATE INDEX) 创建索引,这将是非常快的。将数据装载到一个已经有 FULLTEXT 索引的表中,将是非常慢的。
特性:
create table info( id int not null AUTO_INCREMENT primary key, title varchar(200) not null default ‘‘, info text, fulltext (title,info) )ENGINE=MyISAM default CHARSET=utf8; insert into info(title,info) values (‘Metal chunks hit cars in Toronto after Air Canada jet engine failure‘,‘Chunks of metal the size of a cellphone fell onto cars in ‘), (‘Air Canada jet engine failure‘,‘fell onto cars in ‘), (‘MySQL Tutorial‘,‘DBMS stands for DataBase‘), (‘How To Use MySQL Well‘,‘After you went through a‘), (‘Angels ace Weaver leaves with injury‘,‘Weaver an MRI exam Tuesday, and manager Mike Scioscia isn\‘t‘), (‘his motorcycle Sunday morning in Marietta‘,‘Peterson said. Williams has been listed in serious but stable , Peterson said‘), (‘ Monday an undisclosed hospital‘,‘ will have Peterson said‘), (‘Optimizing MySQL‘,‘In this tutorial we will show‘), (‘1001 MySQL Tricks‘,‘1. Never run mysqld as root‘), (‘Manager: Boxer Williams paralyzed‘,‘Williams, 30, severed his spinal cord after falling on his back and head when he was thrown‘), (‘MySQL vs. YourSQL‘,‘In the following database comparison‘), (‘MySQL Security‘,‘When configured properly, MySQL‘), (‘LeBron, Wade lift Heat to Game 1 win‘,‘And with that, the Heat are three wins away from another trip to the NBA finals‘);
select * from info where match(title,info) against(‘mysql‘);
MySQL FULLTEXT 执行将任何单字字符原形 (字母、数字和下划线部分)的序列视为一个单词。这个序列或许也包含单引号 (‘),但在一行中不会超过一个。 这意味着 aaa‘bbb 会被视为一个单词,而 aaa‘‘bbb则被视为2个单词。位于单词之前或其后的单引号会被FULLTEXT分析程序去掉; ‘aaa‘bbb‘ 会变成 aaa‘bbb。
FULLTEXT分析程序会通过寻找某些分隔符来确定单词的起始位置和结束位置,例如‘ ‘ (间隔符号)、 , (逗号)以及 . (句号 )。假如单词没有被分隔符分开,(例如在中文里 ), 则 FULLTEXT 分析程序不能确定一个词的起始位置和结束位置。为了能够在这样的语言中向FULLTEXT 索引添加单词或其它编入索引的术语,你必须对它们进行预处理,使其被一些诸如"之类的任意分隔符分隔开
一些词在全文搜索中会被忽略:
1、任何过于短的词都会被忽略。 全文搜索所能找到的词的默认最小长度为 4个字符
2、停止字中的词会被忽略。禁用词就是一个像“the” 或“some” 这样过于平常而被认为是不具语义的词。存在一个内置的停止字, 但它可以通过用户自定义列表被改写。
词库和询问中每一个正确的单词根据其在词库和询问中的重要性而被衡量。 通过这种方式,一个出现在许多文件中的单词具有较低的重要性(而且甚至很多单词的重要性为零),原因是在这个特别词库中其语义价值较低。反之,假如这个单词比较少见,那么它会得到一个较高的重要性。然后单词的重要性被组合,从而用来计算该行的相关性。
这项技术最适合同大型词库一起使用 (事实上, 此时它经过仔细的调整 )。对于很小的表,单词分布并不能充分反映它们的语义价值, 而这个模式有时可能会产生奇特的结果。
有时候如果你你查询的一个词在你的表中的字段的条数达到了50%以上。这个搜索的结果为空,那么你输入的词它被列入停止字.解决这个就用布尔查询
布尔全文搜索
特点:
布尔全文搜索的性能支持以下操作符:
select * from info where match(title,info) against("+mysql -yoursql" in boolean mode); select * from info where match(title,info) against(‘+configured +database‘);
全文搜索带查询扩展
全文搜索支持查询扩展功能 (特别是其多变的“盲查询扩展功能” )。若搜索短语的长度过短, 那么用户则需要依靠全文搜索引擎通常缺乏的内隐知识进行查询。这时,查询扩展功能通常很有用。例如, 某位搜索 “database” 一词的用户,可能认为“MySQL”、“Oracle”、“DB2” and “RDBMS”均为符合 “databases”的项,因此都应被返回。这既为内隐知识。
在下列搜索短语后添加WITH QUERY EXPANSION,激活盲查询扩展功能(即通常所说的自动相关性反馈)。它将执行两次搜索,其中第二次搜索的搜索短语是同第一次搜索时找到的少数顶层文件连接的原始搜索短语。这样,假如这些文件中的一个 含有单词 “databases” 以及单词 “MySQL”, 则第二次搜索会寻找含有单词“MySQL” 的文件,即使这些文件不包含单词 “database”。
select * from info where match(title,info) against(‘DataBase‘ with query EXPANSION);
转自http://blog.csdn.net/ms_x0828/article/details/7613465
原文:http://www.cnblogs.com/crazylqy/p/4361349.html