我注意到MATCH AGAINST
无法搜索包含3个或更少字符的单词。因此,我在一个查询中添加了LIKE
和MATCH AGAINST
。
搜索查询:css和javascript提示
数据库条目:
id | subject
------------------------------------
1 | ten useful css tricks
------------------------------------
2 | performance tip for javascript
MySQL查询:
3个字符的单词:css,提示
SELECT id, MATCH (subject) AGAINST ('css and javascript tip' IN BOOLEAN MODE)
FROM articles WHERE MATCH (subject) AGAINST ('css and javascript tip')
OR subject LIKE '%css%' OR subject LIKE '%tip%'
这个查询在我的应用程序(使用小型数据库)上运行良好。我不确定随着数据库的增长,它是否会引起任何问题。
这是在使用MATCH ANTION时搜索3个字符单词的正确方法吗?如果没有,就像我提供的例子一样,我应该如何同时搜索css和javascript?
我用大约100K的行来完成它,而且速度并不慢。我认为还有其他选择,但对我来说这仍然足够:)
这里有一个例子:
//...
$tokens = explode(' ',$s));
$squery = '';
array_map('trim', $tokens);
foreach($tokens as $token){
if(strlen($token)>3)
$squery .= "+$token* ";
else
$where .= " AND title LIKE '%$token%'";
if(!empty($squery))
$select .= " , MATCH (title) AGAINST ('$squery' IN BOOLEAN MODE) AS score "
//...
对于Windows用户,您可以更改Mysql系统变量中的最小单词。编辑通常位于programdata/mysql/mysql-server5.x目录中的my.ini文件。有时,您必须将my.ini文件复制到程序文件/mysql/mysql-server5.x中才能使其工作。正如我在windows server 2003和2008中所经历的,而第一个在windows 7中工作。
在以下[mysqld]中插入以下内容:
ft_min_word_len = 2
ft_stopword_file = ""
重新启动Mysql,你可以在服务中做到这一点,停止并播放,或者你知道的。
然后重新索引您的表,确保引擎是MYISAM。尽管最近InnoDB也在工作。
ft_stop_word_file会导致某些单词被排除在匹配之外。如果您有一个停止字文件,您可以将其等于",也可以指向所需的纯文本文件。你可以创建自己的stopword文件,例如mystopword.txt,里面会有用空格分隔的单词,你不想在匹配中包含这些单词。