mysql全文模糊搜索MATCH AGAINST方法示例
mysql4.x以上提供了全文检索支持MATCH……AGAINST模式(不区分大小写)
建立全文索引的表的存储引擎类型必须为MyISAM
问题是matchagainst对中文模糊搜索支持不是太好
新建一个utf8MyISAM类型的表并建立一个全文索引:
CREATETABLEarticles( idINTUNSIGNEDAUTO_INCREMENTNOTNULLPRIMARYKEY, titleVARCHAR(200), bodyTEXT, FULLTEXT(title,body) )ENGINE=MyISAMDEFAULT>
其中FULLTEXT(title,body)给title和body这两列建立全文索引,之后检索的时候注意必须同时指定这两列。
给这个表添加点测试数据
INSERTINTOarticles(title,body)VALUES ('MySQLTutorial','DBMSstandsforDataBase...'), ('HowToUseMySQLWell','Afteryouwentthrougha...'), ('OptimizingMySQL','Inthistutorialwewillshow...'), ('1001MySQLTricks','1.Neverrunmysqldasroot.2....'), ('MySQLvs.YourSQL','Inthefollowingdatabasecomparison...'), ('MySQLSecurity','Whenconfiguredproperly,MySQL...');
全文检索测试
SELECT*FROMarticlesWHEREMATCH(title,body)AGAINST('database');
注意MATCH(title,body)里面的值必须是前面建立全文索引的两个字段不能少。
mysql默认支持全文检索的字符长度是4,可以用SHOWVARIABLESLIKE'ft_min_word_len'来查看指定的字符长度,也可以在mysql配置文件my.ini更改最小字符长度,方法是在my.ini增加一行比如:ft_min_word_len=2,改完后重启mysql即可。
另外,MySQL还会计算一个词的权值,以决定是否出现在结果集中,具体如下:
mysql在集和查询中的对每个合适的词都会先计算它们的权重,一个出现在多个文档中的词将有较低的权重(可能甚至有一个零权重),因为在这个特定的集中,它有较低的语义值。否则,如果词是较少的,它将得到一个较高的权重,mysql默认的阀值是50%,上面‘you'在每个文档都出现,因此是100%,只有低于50%的才会出现在结果集中。
全文检索语法
SELECT*FROMarticlesWHEREMATCH(title,body)AGAINST('+apple-banana'INBOOLEANMODE);
表示AND,即必须包含。-表示NOT,即不包含。
SELECT*FROMarticlesWHEREMATCH(title,body)AGAINST('applebanana'INBOOLEANMODE);
apple和banana之间是空格,空格表示OR,即至少包含apple、banana中的一个。
SELECT*FROMarticlesWHEREMATCH(title,body)AGAINST('+applebanana'INBOOLEANMODE);
必须包含apple,但是如果同时也包含banana则会获得更高的权重。
SELECT*FROMarticlesWHEREMATCH(title,body)AGAINST('+apple~banana'INBOOLEANMODE);
~是我们熟悉的异或运算符。返回的记录必须包含apple,但是如果同时也包含banana会降低权重。但是它没有+apple-banana严格,因为后者如果包含banana压根就不返回。
SELECT*FROMarticlesWHEREMATCH(title,body)AGAINST('+apple+(>banana返回同时包含apple和banana或者同时包含apple和orange的记录。但是同时包含apple和banana的记录的权重高于同时包含apple和orange的记录。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。