Php Mysql搜索所有字符串排列

Php Mysql搜索所有字符串排列,php,mysql,pdo,Php,Mysql,Pdo,我想在数据库列varchar中搜索由空格分隔的字符串的所有排列。例如: search: foo matches: foo, foo bar, bar foo search: foo bar matches: foo bar, bar foo, bar foo green, green foo bar 我使用PHP和PDO来生成搜索。在创建和搜索包含很多单词的字符串时,我遇到了速度问题,因为要创建和包含在查询中的可能排列太多了。下面是我用来生成排列的PHP代码。也许有办法减少术语的数量 函

我想在数据库列
varchar
中搜索由空格分隔的字符串的所有排列。例如:

search:  foo
matches: foo, foo bar, bar foo

search:  foo bar
matches: foo bar, bar foo, bar foo green, green foo bar
我使用PHP和PDO来生成搜索。在创建和搜索包含很多单词的字符串时,我遇到了速度问题,因为要创建和包含在查询中的可能排列太多了。下面是我用来生成排列的PHP代码。也许有办法减少术语的数量

函数置换($set){
$solutions=数组($set);
$n=计数($set);
$p=数组_键($set);
$i=1;
而($i<$n){
如果($p[$i]>0){
$p[$i]-;
$j=0;
如果($i%2==1)
$j=$p[$i];
//交换
$tmp=$set[$j];
$set[$j]=$set[$i];
$set[$i]=$tmp;
$i=1;
$solutions[]=$set;
}
elseif($p[$i]==0){
$p[$i]=$i;
$i++;
}
}
返回$solutions;
}

在我看来,您的逻辑相当于简单地检查一个或多个关键字是否存在于数据库列中的字符串/句子的任何位置。如果是这样,那么以下类型的查询可能就足够了:

SELECT *
FROM yourTable
WHERE
    column LIKE CONCAT('%', 'foo', '%') AND
    column LIKE CONCAT('%', 'bar', '%')
如果您计划做大量这类工作,那么您可能值得投资学习MySQL的全文搜索功能。如果表上有全文索引,那么下面这样的查询也很接近您的想法:

SELECT *
FROM yourTable
WHERE MATCH(column) AGAINST('foo,bar')

我在项目中使用我的功能: 这个函数chesk does$列类似于$what

例如:

student = smith
what= mike smith
result:YES

反之亦然:

student =mikesmith
what= smith
result:YES

function TRIM_SEARCH_TABLE_UNIQ($column,$what)
{
 $Find=0;

   $e1=strpos('0'.trim(strtolower($column)),trim(strtolower($what)));
   $e2=strpos('0'.trim(($what)),trim(strtolower($column))); 
   if(($e1>0)||($e2>0))
        { 
            $Find=1;
            return "YES";
        }

 return "NO";
}

您可以尝试对字符串的所有排列进行
匹配。例如:

SELECT * FROM table WHERE MATCH(column) AGAINST ('foo bar');
匹配:foo-bar,bar-foo,foo-bar-green,green-bar-foo,foo-green-bar,bar-green-foo,foo,bar


但是,对于您的请求,您可以进行一些修改,以便在搜索字符串的每个单词处添加
+
运算符:

$search_string = "foo bar";
$search_string = "+". str_replace(' ', " +", $search_string);
并按如下方式运行sql:

SELECT * FROM table WHERE MATCH(column) AGAINST ('$search_string' IN BOOLEAN MODE);
匹配:foo-bar,bar-foo,foo-bar-green,green-bar-foo,foo-green-bar,bar-green-foo


请记住在列结构上添加全文索引:

ALTER TABLE table ADD FULLTEXT (column);


全文搜索参考:

这是一个方便的功能,但是我想在查询时执行搜索。否则我将不得不拉所有的行(很多),然后执行这个函数。也许我在问题中没有很好地表达这一点,但如果搜索词有两个词,我希望它们都出现在答案中。@JohnCarroll我的查询符合此要求。你费心去测试了吗?我检查每个搜索词是否存在,只有当所有搜索词都存在时,才会返回一条记录。不,我没有测试,我阅读了解释,认为它很接近,但不匹配。我现在就要测试了。这是我目前所寻找的最接近的。我不知道这场比赛的情况。谢谢你给我看!唯一的问题是我不希望
foo-bar
匹配
foo
bar
。我希望它能匹配
foo bar
bar foo
bar foo green
,…令人惊讶-我很想看看这是如何根据Tim的答案测试速度的Tim的答案(全文法)匹配:foo bar,bar foo,foo bar green,green bar foo,foo green bar,bar green foo,foo,foo,bar。不是你想要的结果,他得到了勾号,搜索速度应该很快,因为该列在全文索引下