sql >> データベース >  >> RDS >> Mysql

漢字でMysql全文検索を実行する方法は?

    RandomSeedの提案「MySQL5.0を使用したフルテキストとアジア言語」によって問題を解決しようとしました。ただし、問題は、「ft_min_word_len」を2に設定しない限り、2文字の検索を実行できないことです。この場合も、月額1ドルのウェブホスティングサービスでは実行できません。

    了解しました。回避策を検討するために1泊しました。コンセプトは、UTF-8文字列のすべての非アルファベット文字をいくつかの一意のコードに変換することです。

    これが魔法の機能です。 CSDNフォーラムから借用し、いくつかの変更を加えました。

    function UTF2UCS($str, $s) {
        $str = strtolower($str);
        $char = 'UTF-8';
        $arr = array();
        $out = "";
        $c = mb_strlen($str,$char);
        $t = false;
    
        for($i =0;$i<$c;$i++){
            $arr[]=mb_substr($str,$i,1,$char);
        }
    
        foreach($arr as $i=>$v){
            if(preg_match('/\w/i',$v,$match)){
                $out .= $v;
                $t = true;
            }else{
                if($t) $out .= " ";
                if(isset($s) && $s) $out .= "+";
                $out .= bin2hex(iconv("UTF-8","UCS-2",$v))." ";
                $t = false;
            }
        }
        return $out;
    }
    

    の結果
    echo UTF2UCS("測試haha")
    

    「6e2c8a66haha」になります

    「song_name」というフィールドがあるとします。 UTF2UCS関数ですべての曲名を変換してから、それらの暗号化された文字列をフルテキストインデックスフィールド(「song_name_ucs」など)に保存する必要があります。

    次に何かを検索する必要があるときは、次のことを行う必要があります。

    $temp_string = UTF2UCS('測試', true);
    SELECT * FROM song WHERE MATCH (song_name_ucs) AGAINST ('$temp_string') 
    

    検索結果に「照」と「試」の両方が表示される必要がある場合は、UTF2UCSの2番目のパラメーターにtrueを入力することを忘れないでください。

    これは最善の解決策ではないかもしれませんが、プラグインやシステムへの変更は必要ありません。純粋なPHPコード。



    1. mysqlの最大クエリサイズはいくつですか?

    2. ORA-01652:表領域で一時セグメントを128だけ拡張できません。システム:拡張方法は?

    3. SQL結合の究極のガイド:内部結合–パート1

    4. チャットサーバー:会話ログを保存するための最良の(最適化された)方法は何ですか