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文字異なる単語が表示されます。

2文字をUNDERSCOREに置き換え、次に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 に答える