gpt4 book ai didi

php - Mysql搜索所有字符串排列

转载 作者:行者123 更新时间:2023-11-29 03:20:47 25 4
gpt4 key购买 nike

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

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

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

我使用带有 PDO 的 PHP 来生成搜索。我在创建和搜索包含很多单词的字符串时遇到了速度问题,因为要创建和包含在查询中的可能排列太多了。下面是我用来生成排列的 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;
}

最佳答案

您可以对字符串的所有排列尝试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

关于php - Mysql搜索所有字符串排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45560036/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com