mysql全文检索

全文索引在 MySQL 中是一个 FULLTEXT 类型索引。FULLTEXT 索引用于 MyISAM 表,可以在 CREATE TABLE 时或之后使用 ALTER TABLE 或 CREATE INDEX 在 CHAR、VARCHAR 或 TEXT 列上创建。对于大的数据库,将数据装载到一个没有 FULLTEXT 索引的表中,然后再使用 ALTER TABLE (或 CREATE INDEX) 创建索引,这将是非常快的。将数据装载到一个已经有 FULLTEXT 索引的表中,将是非常慢的。

特性

  • 比起 LIKE 速度还可以
  • 对英文单词的匹配不错
  • 使用简单,无需额外辅助
  • 全文索引FULLTEXT适用于字符串类型的字段信息
  • 如果有这种索引再做批量更新速度很慢
  • 只有MYISAM类型的表才支持FULLTEXT全文索引
  • 默认ft_min_word_len=4 即忽略小于4个字符的单词,用户可改
  • 内置保留字,像some,big,the等等,会被直接忽略
  • 对于大型数据库,将数据装载到一个没有 FULLTEXT 索引的表中,然后再使用 ALTER TABLE (或 CREATE INDEX) 创建索引,这将是非常快的,反之是非常慢的

 

    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%以上。这个搜索的结果为空,那么你输入的词它被列入停止字.解决这个就用布尔查询

布尔全文搜索

特点:

  1. 它们不使用 50% 域值
  2. 它们不会按照相关性渐弱的顺序将行进行分类。你可以从上述问询结果中看到这一点:相关性最高的行是一个包含两个“MySQL” 的行,但它被列在最后的位置,而不是开头位置
  3. 即使没有FULLTEXT,它们仍然可以工作,尽管这种方式的搜索执行的速度非常之慢
  4. 最小单词长度全文参数和最大单词长度全文参数均适用
  5. 停止字适用

布尔全文搜索的性能支持以下操作符:

  • " + " 一个前导的加号表示该单词必须 出现在返回的每一行的开头位置
  • " - "一个前导的减号表示该单词一定不能出现在任何返回的行中
  • (无操作符) 在默认状态下(当没有指定 + 或–的情况下),该单词可有可无,但含有该单词的行等级较高。这和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”的行

 

    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

 

posted @ 2015-03-23 23:20  crazyYong  阅读(667)  评论(0编辑  收藏  举报