我的MySQL数据库中有一个表,其中包含Title(varchar(255))和Edition(varchar(20))列。这些的示例值是“微观经济学导论”和“4”。
我想让用户根据标题和版本搜索图书。因此,例如,他们可以进入“微观经济学4”,它将获得正确的结果。我的问题是我应该如何在数据库方面进行设置。
我被告知FULLTEXT搜索通常是做这样事情的好方法。但是,由于版本有时只是一个字符(“4”),因此必须设置全文搜索才能查看单个字符(ft_min_word_len = 1)。我听说这是非常低效的。
那么,我应该如何设置此数据库的搜索?
更新:我知道这里可以使用CONCAT / LIKE ..我的问题是它是否会太慢。我的图书数据库有数十万本书,很多用户都会搜索它。
答案 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)之间的延迟不是问题。另外,通过谨慎使用wordforms和exceptions,您可以将4/4 / 4th / IV all等内容映射到同一令牌以改进搜索。