在一个MySQL查询中同时使用MATCH-on和LIKE可以吗?

在一个MySQL查询中同时使用MATCH-on和LIKE可以吗?,mysql,search-engine,sql-like,match-against,Mysql,Search Engine,Sql Like,Match Against,我注意到,MATCH-on无法搜索包含3个或更少字符的单词。因此,我在one查询中添加了LIKE以及MATCH-on 搜索查询:css和javascript提示 数据库条目: id | subject ------------------------------------ 1 | ten useful css tricks ------------------------------------ 2 | performance tip for javascript MySQL查询: id

我注意到,
MATCH-on
无法搜索包含3个或更少字符的单词。因此,我在one查询中添加了
LIKE
以及
MATCH-on

搜索查询:css和javascript提示

数据库条目:

id | subject
------------------------------------
1  | ten useful css tricks
------------------------------------
2  | performance tip for javascript
MySQL查询:

id | subject
------------------------------------
1  | ten useful css tricks
------------------------------------
2  | performance tip for javascript
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%'
此查询在我的应用程序(使用小型数据库)上运行良好。随着数据库的增长,我不确定它是否会引起任何问题


在使用“匹配”时,这是搜索3个字符的单词的正确方法吗?如果没有,就像我提供的示例一样,我应该如何同时搜索cssjavascript

我使用大约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 "
//...

我用大约10万行来做,速度并不慢。 我认为还有其他选择,但对我来说这仍然足够:)

下面是一个例子:

//...
$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 server 5.x目录中的my.ini文件。有时,您必须将my.ini文件复制到program files/mysql/mysql server 5.x版本中,才能使其正常工作。正如我在WindowsServer2003和2008中所经历的,而第一个在Windows7中工作

在[mysqld]下面插入以下内容:

ft_min_word_len = 2  
ft_stopword_file = ""
重新启动Mysql,您可以在服务中执行此操作,停止并播放或您知道的任何内容

然后重新索引表,确保引擎是MYISAM。尽管最近InnoDB也能工作


ft_stop_word_文件会导致某些单词被排除在匹配之外。如果有stopword文件,则可以将其等于“”或指向所需的纯文本文件。您可以创建自己的stopword文件,例如mystopword.txt,其中的单词用空格分隔,您不希望在匹配中包含这些单词。

对于Windows用户,您可以更改Mysql系统变量中的最小单词数。编辑通常位于programdata/mysql/mysql server 5.x目录中的my.ini文件。有时,您必须将my.ini文件复制到program files/mysql/mysql server 5.x版本中,才能使其正常工作。正如我在WindowsServer2003和2008中所经历的,而第一个在Windows7中工作

在[mysqld]下面插入以下内容:

ft_min_word_len = 2  
ft_stopword_file = ""
重新启动Mysql,您可以在服务中执行此操作,停止并播放或您知道的任何内容

然后重新索引表,确保引擎是MYISAM。尽管最近InnoDB也能工作

ft_stop_word_文件会导致某些单词被排除在匹配之外。如果有stopword文件,则可以将其等于“”或指向所需的纯文本文件。您可以创建自己的stopword文件示例mystopword.txt,其中的单词用空格分隔,您不希望在匹配中包含这些单词