微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

mysql 搜索之简单应用

如何在MysqL中获得更好的全文搜索结果
作者:Techrepublic.com.com
2006-04-0311:14:53
很多互联网应用程序都提供了全文搜索功能用户可以使用一个词或者词语片断作为查询项目来定位匹配的记录。在后台,这些程序使用在一个SELECT查询中的LIKE语句来执行这种查询,尽管这种方法可行,但对于全文查找而言,这是一种效率极端低下的方法,尤其在处理大量数据的时候。 MysqL针对这一问题提供了一种基于内建的全文查找方式的解决方案。在此,开发者只需要简单地标记出需要全文查找的字段,然后使用特殊的MysqL方法在那些字段运行搜索,这不仅仅提高了性能和效率(因为MysqL对这些字段做了索引来优化搜索),而且实现了更高质量的搜索,因为MysqL使用自然语言来智能地对结果评级,以去掉不相关的项目。 这篇文章将向您讲述在MysqL中如何进行全文搜索。 1、设置基本表格 从创建例子表格开始,使用以下的sql命令: MysqL>CREATETABLEreviews(idINT(5)PRIMARYKEYNOTNULLAUTO_INCREMENT,dataTEXT); 以上命令创建了一个简单的音乐专集资料库(主要是整段的文字),然后向这个表格中添加一些记录: MysqL>INSERTINTOreviews(id,data)VALUES (1,'GingerboyhasanewsingleoutcalledThrowingRocks.It'sgreat!'); MysqL>INSERTINTOreviews(id,data)VALUES (2,'Helloall,IreallylikethenewMadonnasingle. Oneofthehottesttrackscurrentlyplaying...I'vebeenlisteningtoitallday'); MysqL>INSERTINTOreviews(id,data) VALUES(3,'HaveyouheardthenewbandHotterThanHell? Theyhavefivemembersandtheyburntheirinstrumentswhentheyplayinconcerts. Theseguystotallyrock!Like,awesome,dude!'); 验证数据的正确录入: MysqL>SELECTFRomreviews; +----+--------------------------------------------+ |id|data| +----+--------------------------------------------+ |1|Gingerboyhasanewsingleoutcalled...| |2|Helloall,IreallylikethenewMadon...| |3|HaveyouheardthenewbandHotterThan...| +----+--------------------------------------------+ 3rowsinset(0.00sec) 2、定义全文搜索字段 接下来,定义您要作为全文搜索索引的字段 MysqL>ALTERTABLEreviewsADDFULLTEXTINDEX(data); QueryOK,3rowsaffected(0.21sec) Records:3Duplicates:0Warnings:0 使用SHOWINDEXES命令来检查索引已经被添加了: MysqL>SHOWINDEXESFRomreviews; +---------+---------------+--------+------+------------+---------+ |Table|Column_name|Packed|Null|Index_type|Comment| ----------+---------------+--------+------+------------+---------+ |reviews|id|NULL||BTREE|| |reviews|data|NULL|YES|FULLTEXT|| +---------+---------------+--------+------+------------+---------+ 2rowsinset(0.01sec) 3、运行全文搜索 当您拥有了数据和索引,就可以使用MysqL的全文搜索了,最简单的全文搜索方式是带有MATCH...AGAINST语句的SELECT查询,以下是一个简单的例子,可以来查找含有单词“single”的记录: MysqL>SELECTidFRomreviewsWHEREMATCH(data)AGAINST('single');+----+ |id| +----+ |1| |2| +----+ 2rowsinset(0.00sec) 在此,match()将作为参数传递给它的字段中的文字与传递给AGAINST()的参数进行比较,如果有匹配的,那就按照正常的方式返回。注意您可以传递不止一个字段用match()来查看­-只需用逗号来分割字段列表。 当MysqL收到了一个全文搜索的请求,它就在内部对每个记录进行评分,不匹配的记录得分为零,而“更相关”的记录会得到比“不太相关”的记录相对更高的分数。相关性是由MysqL的一系列区分标准来决定的,查看MysqL用户手册可以得到更多的信息。 想看到每个记录的评分如何,只需要返回match()方法作为结果集的一部分,如下所示: MysqL>SELECTid,MATCH(data)AGAINST('rock')FRomreviews; +----+-------------------------------+ |id|MATCH(data)AGAINST('rock')| +----+-------------------------------+ |1|0| |2|0| |3|1.3862514533815| +----+-------------------------------+ 3rowsinset(0.00sec) 4、使用逻辑搜索修饰符(Booleansearchmodifiers) 您还可以使用逻辑搜索修饰符来进行更精确的搜索,这通过在AGAINST语句中添加特殊的INBOOLEANMODE修饰符来实现,在以下的例子中,将查找含有单词“single”但是没有“Madonna”的记录: MysqL>SELECTidFRomreviewsWHEREMATCH(data)AGAINST('+single-madonna'INBOOLEANMODE); +----+ |id| +----+ |1| +----+ 1rowinset(0.00sec) 这一搜索特性通常用于搜索单词片断(而不是完整的词语),这可以通过在INBOOLEANMODE语句中的(星号)操作符来实现,以下的例子展示了如何查找单词中含有“hot”的记录: MysqL>SELECTidFRomreviewsWHEREMATCH(data)AGAINST('hot*'INBOOLEANMODE);+----+ |id| +----+ |3| |2| +----+ 2rowsinset(0.00sec) 您还可以使用这种方法来查找至少一个传递到AGAINST的参数中,以下的例子查找了至少包含单词“hell”和“rocks”中的一个的记录: MysqL>SELECTidFRomreviewsWHEREMATCH(data)AGAINST('hellrocks'INBOOLEANMODE); +----+ |id| +----+ |1| |3| +----+ 2rowsinset(0.00sec) 以上的这些例子演示了相对于传统的SELECT...LIKE语句,进行全文搜索的更有效的方法,当您下一次需要编写MysqL数据库搜索界面的时候,您可以尝试这一方法

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐