我想在数据库列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;
}
答案 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
反之亦然:
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