一、mysql最长使用的搜索引擎为MyISAM和InnoDB ,前者支持,后者不支持。
二、 全文本搜索有比LIKE匹配和正则表达式匹配更强的功能,在对表进行全文本搜索时,MySQL不需要分表查看每个行,不需要分别分析和处理每个词。 MySQL创建指定列中各词的一个索引,搜索可以针对这些词进行。这样,MySQL可以有效的决定哪些词匹配(哪些行包含他们),哪些词不匹配,他们的匹 配频率,等等。
三、为了进行全文本搜索,必须索引被搜索的列,而且要随着数据的改变不断的重新索引。在对表列进行适当设计后,MySQL会自动进行所有的索引和重新索引。在索引之后,SELECT可与Match()和Against()一起使用以实际执行搜索。
四、一般在创建表时启用全文本搜索。CREATE TABLE语句接受FULLTEXT子句,它给出被索引列的一个逗号分隔的列表。
CREATE TABLE productnotes
(
note_id INT NOT NULL AUTO_INCREAMENT,
prod_id CHAR(10) NOT NULL,
note_data DATETIME NOT NULL,
note_text TEXT NULL,
PRIARY KEY(note_id),
FULLTEXT(note_text)
)ENGINE=MyISAM
这里只指定了一个列note_text进行索引,如果需要也可以指定多个列。在定义之后,MySQL自动维护该索引。增加、删除和更新行之后,索引会随之自动更新。可以在创建表时使用FULLTEXT,也可以稍后使用。
注意:不要在导入数据时使用FULLTEXT。
全文索引在 MySQL 中是一个 FULLTEXT 类型索引。FULLTEXT 索引用于 MyISAM 表,可以在 CREATE TABLE 时或之后使用 ALTER TABLE 或 CREATE INDEX 在 CHAR、VARCHAR 或 TEXT 列上创建。对于大的数据库,将数据装载到一个没有 FULLTEXT 索引的表中,然后再使用 ALTER TABLE (或 CREATE INDEX) 创建索引,这将是非常快的。将数据装载到一个已经有 FULLTEXT 索引的表中,将是非常慢的。
五、 在索引之后,使用两个函数Match()和Against()执行全文本搜索,其中Match()制定被搜索的列,Against() 指定要使用的搜索表达式:
select note_text from productnotes where match(note_text) against(‘hello’);
注意:1。传递给Match()的值必须与FULLTEXT()定义的相同。如果指定多个列,则必须列出它们且次序正确。2. 除非使用BINARY方式,否则全文本搜索不区分大小写。
试一下这个语句:select note_text,MATCH(note_text) Against as rank from productnotes
六、使用查询扩展,能找出可能相关的结果,即使他们并不精确包含所要查找的词。
select note_text from productnotes where match(note_text) against(‘hello’ with QUERY EXPANSION) .
特性:
比起 LIKE 速度还可以
对英文单词的匹配不错
使用简单,无需额外辅助
全文索引FULLTEXT适用于字符串类型的字段信息
如果有这种索引再做批量更新速度很慢
只有MYISAM类型的表才支持FULLTEXT全文索引
默认ft_min_word_len=4 即忽略小于4个字符的单词,用户可改
内置保留字,像some,big,the等等,会被直接忽略
对于大型数据库,将数据装载到一个没有 FULLTEXT 索引的表中,然后再使用 ALTER TABLE (或 CREATE INDEX) 创建索引,这将是非常快的,反之是非常慢的
全文搜索带查询扩展
全文搜索支持查询扩展功能 (特别是其多变的“盲查询扩展功能” )。若搜索短语的长度过短, 那么用户则需要依靠全文搜索引擎通常缺乏的内隐知识进行查询。这时,查询扩展功能通常很有用。例如, 某位搜索 “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);
布尔全文搜索
特点:
它们不使用 50% 域值
它们不会按照相关性渐弱的顺序将行进行分类。你可以从上述问询结果中看到这一点:相关性最高的行是一个包含两个“MySQL” 的行,但它被列在最后的位置,而不是开头位置
即使没有FULLTEXT,它们仍然可以工作,尽管这种方式的搜索执行的速度非常之慢
最小单词长度全文参数和最大单词长度全文参数均适用
停止字适用
布尔全文搜索的性能支持以下操作符:
” + ” 一个前导的加号表示该单词必须 出现在返回的每一行的开头位置
” – “一个前导的减号表示该单词一定不能出现在任何返回的行中
(无操作符) 在默认状态下(当没有指定 + 或–的情况下),该单词可有可无,但含有该单词的行等级较高。这和MATCH() … AGAINST()不使用IN BOOLEAN MODE修改程序时的运作很类似
” > < "这两个操作符用来改变一个单词对赋予某一行的相关值的影响。 > 操作符增强其影响,而 <操作符则减弱其影响。请参见下面的例子
" () "括号用来将单词分成子表达式。括入括号的部分可以被嵌套
" ~ "一个前导的代字号用作否定符, 用来否定单词对该行相关性的影响。 这对于标记“noise(无用信息)”的单词很有用。包含这类单词的行较其它行等级低,但因其可能会和-号同时使用,因而不会在任何时候都派出所有无用信息行
" * "星号用作截断符。于其它符号不同的是,它应当被追加到要截断的词上
" " "一个被括入双引号的短语 (‘"’) 只和字面上包含该短语输入格式的行进行匹配。全文引擎将短语拆分成单词,在FULLTEXT索引中搜索该单词。 非单词字符不需要严密的匹配:短语搜索只要求符合搜索短语包含的单词且单词的排列顺序相同的内容。例如, "test phrase" 符合 "test, phrase"。
"configured database "寻找包含至少两个单词中的一个的行
" +configured +database "寻找两个单词都包含的行
" +configured database "寻找包含单词“"configured”的行,若这些行也包含单词“"database”, 则列为更高等级
" +configured -database "寻找包含单词“configured” 但不包含单词 “database”的行
" +configured +(>database<sql) "寻找包含单词“configured”和“database” 的行,或包含“configured” 和“sql”的行 (无先后顺序),然而包含 “configured database”的行较包含“configured sql”的行排列等级更为高
" mysql* "寻找包含"mysql"或有"mysql"开头单词的行
" “my sql” "寻找包含原短语“my sql”的行
[sql][/sql] view plaincopy
select * from info where match(title,info) against("+mysql -yoursql" in boolean mode);
select * from info where match(title,info) against('+configured +database');