2

我正在开发一种搜索功能来搜索型号,并且我正在尝试让 MySQL 向我显示与我要求的结果相似的结果,但 LIKE %$var% 并没有这样做。

示例(我们将调用表“tbl_models”):

    id           model
+-------+--------------------+
|   1   |    DV6233SE        |
|   2   |    Studio 1440     |
|   3   |    C762NR          |
+-------+--------------------+

使用我当前使用的搜索框进行搜索时:

SELECT id, model FROM tbl_models WHERE model LIKE %$var% ORDER BY id DESC

如果我搜索“C7”,它会返回“C762NR”,这很好,但说我要搜索“C760”或“C700”或“C726NR”的拼写错误?MySQL(或 PHP、JS、jQuery)中是否有一种方法可以扩展返回结果的限制以包括不同的变体或紧密匹配?

我也不是在找人为我写它,只是朝着正确的方向推动会非常有帮助!

4

4 回答 4

2

如果我要为您的问题应用逻辑,我会这样做。

要找到接近的匹配项 -

我将采用用户最初输入的输入参数。例如'ABCDEF' 然后我将通过将输入参数中的每个字符替换为'_'来创建多个参数。

即“ABCDEF”将为我生成以下输入参数。

'_BCDEF'、'A_CDEF'、'AB_DEF'、'ABC_EF'、'ABCD_F'、'ABCDE_'

然后我会将输入参数传递给 SQL 查询并使用 OR 操作来查找数据。

上面的方法会给我相差 1 个字符的单词。

我可以通过用 UNDERSCORE 替换 2 个字符,然后是 3 个字符,然后是 4 个,依此类推来扩展这一点。

最多我必须替换多少个字符,应该取决于字符串的长度。

于 2013-01-20T05:28:40.560 回答
1

看看这个函数......这就是你要找的,我想: http: //php.net/manual/en/function.levenshtein.php。这个函数可能是一个替代方案,但我建议你不要使用它,因为结果可能有点不可预测:http ://www.php.net/manual/en/function.similar-text.php 。

实现您要查找的内容的最佳方法是使用自然语言全文搜索

于 2013-01-20T05:11:38.780 回答
1

根据 SaurabhV 提供的答案(再次感谢!),我能够创建一个函数,该函数接受一个字符串并将每个字母依次替换为下划线。我希望这也可以帮助其他人!

function get_combination($string) {
    // Pa = Pass, Pos = Character Position, Len = String Length

    $str_arr = array($string);
    $Len = strlen($string);
    for ($Pa=0;$Pa<$Len;$Pa++) {
        for($Pos=1;($Pos+$Pa)<=$Len;$Pos++) {
            if($Pos+$Pa == $Len && $Pos<$Pa) {
                array_push($str_arr, substr_replace($string, str_repeat('_', $Pos), $Pa, 1));
            } else if($Pos+$Pa == $Len && $Pos>$Pa) {
                // End of String
            } else if($Pos == $Len || ($Len > 2 && $Pos == ($Len-1))) {
                // Do nothing - $Pos is too high
            } else if($Pos > $Len/2 && $Len > 6) {
                array_push($str_arr, substr_replace($string, str_repeat('_', $Pos-4), $Pa, $Pos-4));
            } else {
                array_push($str_arr, substr_replace($string, str_repeat('_', $Pos), $Pa, $Pos));
            }
        }
    }
    return $str_arr;
}

例子:

$string = get_combination('dv6000');

回报:

Array ( [0] => dv6000 [1] => _v6000 [2] => __6000 [3] => ___000 [4] => ____00 [5] => d_6000 [6] => d__000 [7] => d___00 [8] => d____0 [9] => dv_000 [10] => dv__00 [11] => dv___0 [12] => dv6_00 [13] => dv6__0 [14] => dv6___ [15] => dv60_0 [16] => dv60__0 [17] => dv600_ )

现在,使用 MySQLi 和 foreach 循环,我可以针对数组搜索数据库,以获得与所要求的结果相似的结果。正如您在示例中看到的,“dv6000”是询问的字符串,但在 tbl_models(参见 OP)中没有 dv6000。一旦数据库达到索引 14 (dv6___),它将找到正确的条目:

SELECT model_number FROM tbl_models WHERE model_number LIKE %string[14]%

它很混乱,可能效率不高,但它确实有效。如果有人可以详细说明或帮助我整理此代码以使其更加简化,如果可能的话,我将不胜感激!

于 2013-01-20T20:47:52.000 回答
0

您可以使用PHP上述功能,或者SOUNDEX可以帮助您。看看这个

于 2013-01-20T05:17:08.697 回答