邪恶八进制信息安全团队技术讨论组's Archiver

ring04h 2006-4-15 19:13

[转载]在MySQL中获得更好的搜索结果

<P>信息来源: <FONT color=#cc0000>zdnet</FONT></P>
<P style="TEXT-INDENT: 2em">很多互联网应用程序都提供了全文搜索功能,用户可以使用一个词或者词语片断作为查询项目来定位匹配的记录。在后台,这些程序使用在一个SELECT查询中的LIKE语句来执行这种查询,尽管这种方法可行,但对于全文查找而言,这是一种效率极端低下的方法,尤其在处理大量数据的时候。</P>
<P align=left>  MySQL针对这一问题提供了一种基于内建的全文查找方式的解决方案。在此,开发者只需要简单地标记出需要全文查找的字段,然后使用特殊的MySQL方法在那些字段运行搜索,这不仅仅提高了性能和效率(因为MySQL对这些字段做了索引来优化搜索),而且实现了更高质量的搜索,因为MySQL使用自然  语言来智能地对结果评级,以去掉不相关的项目。</P>
<P>  这篇文章将向您讲述在MySQL中如何进行全文搜索。</P>
<P><STRONG>  1</STRONG><STRONG>、设置基本表格</STRONG></P>
<P>  从创建例子表格开始,使用以下的SQL命令:</P>
<P>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE>  mysql> CREATE TABLE reviews (id INT(5) PRIMARY KEY NOT NULL AUTO_INCREMENT, data TEXT);</PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER>
<P></P>
<P>  以上命令创建了一个简单的音乐专集资料库(主要是整段的文字),然后向这个表格中添加一些记录:</P>
<P>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE>mysql> INSERT INTO `reviews` (`id`, `data`) VALUES<BR>(1, 'Gingerboy has a new single out called Throwing Rocks. It\'s great!');<BR>mysql> INSERT INTO `reviews` (`id`, `data`) VALUES <BR>(2, 'Hello all, I really like the new Madonna single. <BR>One of the hottest tracks currently playing...I\'ve been listening to it all day');<BR>mysql> INSERT INTO `reviews` (`id`, `data`)<BR>VALUES (3, 'Have you heard the new band Hotter Than Hell?<BR>They have five members and they burn their instruments when they play in concerts. <BR>These guys totally rock! Like, awesome, dude!');</PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER>
<P></P>
<P>  验证数据的正确录入:</P>
<P>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE>mysql> SELECT * FROM reviews;<BR>+----+--------------------------------------------+<BR>| id | data |<BR>+----+--------------------------------------------+<BR>| 1 | Gingerboy has a new single out called ... |<BR>| 2 | Hello all, I really like the new Madon ... |<BR>| 3 | Have you heard the new band Hotter Than... |<BR>+----+--------------------------------------------+<BR>3 rows in set (0.00 sec)</PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER>
<P></P>
<P><STRONG>   </P>
<P style="TEXT-INDENT: 2em">2</STRONG><STRONG>、定义全文搜索字段</STRONG></P>
<P>  接下来,定义您要作为全文搜索索引的字段</P>
<P>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE>mysql> ALTER TABLE reviews ADD FULLTEXT INDEX (data);<BR>Query OK, 3 rows affected (0.21 sec)<BR>Records: 3 Duplicates: 0 Warnings: 0</PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER>
<P></P>
<P>  使用SHOW INDEXES命令来检查索引已经被添加了:</P>
<P>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE>mysql> SHOW INDEXES FROM reviews;<BR>+---------+---------------+--------+------+------------+---------+<BR>| Table | Column_name | Packed | Null | Index_type | Comment |<BR>----------+---------------+--------+------+------------+---------+<BR>| reviews | id | NULL | | BTREE | |<BR>| reviews | data | NULL | YES | FULLTEXT | |<BR>+---------+---------------+--------+------+------------+---------+<P></P><P></P></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER>
<P><BR></P>
<P><STRONG>  3</STRONG><STRONG>、运行全文搜索</STRONG></P>
<P>  当您拥有了数据和索引,就可以使用MySQL的全文搜索了,最简单的全文搜索方式是带有MATCH...AGAINST语句的SELECT查询,以下是一个简单的例子,可以来查找含有单词“single”的记录:</P>
<P>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE>mysql> SELECT id FROM reviews WHERE MATCH (data) AGAINST ('single');+----+<BR>| id |<BR>+----+<BR>| 1 |<BR>| 2 |<BR>+----+</PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER>
<P></P>
<P>   </P>
<P style="TEXT-INDENT: 2em">2 rows in set (0.00 sec)</P>
<P>  在此,MATCH()将作为参数传递给它的字段中的文字与传递给AGAINST()的参数进行比较,如果有匹配的,那就按照正常的方式返回。注意您可以传递不止一个字段用MATCH()来查看

页: [1]
© 1999-2008 EvilOctal Security Team