用单字长搜索(MySQL)

时间:2010-07-28 05:23:01

标签: sql mysql search full-text-search

我的MySQL数据库中有一个表,其中包含Title(varchar(255))和Edition(varchar(20))列。这些的示例值是“微观经济学导论”和“4”。

我想让用户根据标题和版本搜索图书。因此,例如,他们可以进入“微观经济学4”,它将获得正确的结果。我的问题是我应该如何在数据库方面进行设置。

我被告知FULLTEXT搜索通常是做这样事情的好方法。但是,由于版本有时只是一个字符(“4”),因此必须设置全文搜索才能查看单个字符(ft_min_word_len = 1)。我听说这是非常低效的。

那么,我应该如何设置此数据库的搜索?

更新:我知道这里可以使用CONCAT / LIKE ..我的问题是它是否会太慢。我的图书数据库有数十万本书,很多用户都会搜索它。

2 个答案:

答案 0 :(得分:3)

以下是解决方案的步骤

1)从用户读取搜索字符串。

2)根据单词之间的空格(“”)将字符串放入部分。

3)使用以下查询获取结果

SELECT * FROM books WHERE Title LIKE'%part [0]%'AND Edition LIKE'%part [1]%';

这里[0]部分[0]和部分[1]是与给定单词

分开的单词

上面的PHP代码可能是

<?php 
     $string_array=explode(" ",$string); //$string is the value we are searching
     $select_query="SELECT * FROM books WHERE Title LIKE '%".$string_array[0]."%' AND Edition LIKE '%".$string_array[1]."%';";
     $result=mysql_fetch_array(mysql_query($select_query));
?>

对于$ string_array [0],它可以扩展到除了最后一个之外的所有部分,可以应用于“微观经济学4简介”

答案 1 :(得分:0)

对于您对 标题和版本感兴趣的应用,我怀疑使用FULLTEXT索引MATCH/AGAINST并减少ft_min_word_len 1对于性能方面没有那么大的影响(如果你的数据更冗长或用户编写的内容,那么我可能会犹豫)。

最简单的检查方法是更改​​值REPAIR表以考虑新的ft_min_word_len并重建索引,然后进行一些简单的基准测试。

话虽如此,对于您的申请,我可能会考虑调查Sphinx。它肯定会更快,而且你的内容相对静态,所以重新索引(Sphinx的主要缺点IMO)之间的延迟不是问题。另外,通过谨慎使用wordformsexceptions,您可以将4/4 / 4th / IV all等内容映射到同一令牌以改进搜索。