Mysql搜索所有字符串排列

时间:2017-08-08 05:35:12

标签: 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代码。也许有办法减少术语数量?

function permutations($set) {
    $solutions = array($set);
    $n = count($set);
    $p = array_keys($set);
    $i = 1;
    while ($i < $n) {
        if ($p[$i] > 0) {
            $p[$i]--;
            $j = 0;
            if ($i % 2 == 1)
                $j = $p[$i];
            //swap
            $tmp = $set[$j];
            $set[$j] = $set[$i];
            $set[$i] = $tmp;
            $i = 1;
            $solutions[] = $set;
        }
        elseif($p[$i] == 0) {
            $p[$i] = $i;
            $i++;
        }
    }
    return $solutions;
}

3 个答案:

答案 0 :(得分:0)

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

SELECT *
FROM yourTable
WHERE
    column LIKE CONCAT('%', 'foo', '%') AND
    column LIKE CONCAT('%', 'bar', '%')

如果您计划进行大量此类工作,那么可能值得花一些时间来学习MySQL的全文搜索功能。如果您的表上有完整的文本索引,那么像下面这样的查询也会接近您的想法:

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

答案 1 :(得分:0)

我在我的项目中使用我的函数: 这个函数chesk确实$ column类似于$ what?

例如:

student = smith
what= mike smith
result:YES

https://3v4l.org/eUOS1

反之亦然:

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";
}

答案 2 :(得分:0)

您可以尝试MATCH AGAINST来查找字符串的所有排列。例如:

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);

全文搜索参考:link