我正在尝试为我的网站创建一个小型搜索。我曾尝试使用全文本索引搜索,但无法使用它。这是我想出的:
if(isset($_GET['search'])) { $search = str_replace('-', ' ', $_GET['search']); $result = array(); $titles = mysql_query("SELECT title FROM Entries WHERE title LIKE '%$search%'"); while($row = mysql_fetch_assoc($titles)) { $result[] = $row['title']; } $tags = mysql_query("SELECT title FROM Entries WHERE tags LIKE '%$search%'"); while($row = mysql_fetch_assoc($tags)) { $result[] = $row['title']; } $text = mysql_query("SELECT title FROM Entries WHERE entry LIKE '%$search%'"); while($row = mysql_fetch_assoc($text)) { $result[] = $row['title']; } $result = array_unique($result); }
因此,基本上,它搜索数据库中所有条目的所有标题,正文和标记。这工作得很好,但是我只是想知道它的效率如何?这也只适用于小型博客。无论哪种方式,我都只是想知道是否可以提高效率。
无法提高LIKE '%pattern%'查询效率。一旦获得大量数据,使用通配符查询将比使用全文本索引解决方案慢数百倍或数千倍。
LIKE '%pattern%'
您应该看一下我为MySQL大学所做的演示:http : //www.slideshare.net/billkarwin/practical- full-text-search-with-my-sql
这是使其工作的方法:
首先确保您的表使用MyISAM存储引擎。MySQL FULLTEXT索引仅支持MyISAM表。( 2012年11月1日编辑: MySQL 5.6为InnoDB表引入了FULLTEXT索引类型。)
ALTER TABLE Entries ENGINE=MyISAM;
创建全文索引。
CREATE FULLTEXT INDEX searchindex ON Entries(title, tags, entry);
搜索一下!
$search = mysql_real_escape_string($search);
$titles = mysql_query(“SELECT title FROM Entries WHERE MATCH(title, tags, entry) AGAINST(‘$search’)”); while($row = mysql_fetch_assoc($titles)) { $result[] = $row[‘title’]; }
请注意,在MATCH子句中命名的列 必须 与在全文索引定义中声明的列相同,并且顺序相同。否则它将无法正常工作。
MATCH
我曾尝试使用全文本索引搜索,但我无法使其正常工作……我只是想知道这样做是否可以提高效率。
这就像在说:“我不知道该如何使用电锯,所以我决定用小刀砍掉这棵红木树。我如何使它和电锯一样好?”
关于您关于搜索匹配超过50%行的单词的评论。
MySQL手册说这个:
需要绕过50%限制的用户可以使用布尔搜索模式;请参见第11.8.2节“布尔全文搜索”。
与此:
自然语言搜索的50%阈值由所选的特定加权方案确定。要禁用它,请在storage / myisam / ftdefs.h中查找以下行: define GWS_IN_USE GWS_PROB 将该行更改为此: define GWS_IN_USE GWS_FREQ 然后重新编译MySQL。在这种情况下,无需重建索引。
自然语言搜索的50%阈值由所选的特定加权方案确定。要禁用它,请在storage / myisam / ftdefs.h中查找以下行:
将该行更改为此:
然后重新编译MySQL。在这种情况下,无需重建索引。
另外,您可能正在搜索 停用词 。这些是全文搜索会忽略的单词,因为它们太常见了。诸如“ the”之类的词。见http://dev.mysql.com/doc/refman/5.1/en/fulltext- stopwords.html