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

php(ファジー)検索マッチング

    残念ながら、PHPでこれを行うと、非常にコストがかかります(CPUとメモリの使用率が高くなります)。ただし、アルゴリズムを小さなデータセットに適用することはできます。

    サーバーメルトダウンを作成する方法を具体的に拡張するには、いくつかの組み込みPHP関数が文字列間の「距離」を決定します:レーベンシュタイン およびsimilar_text

    ダミーデータ:(ニュースの見出しのふりをする)

    $titles = <<< EOF
    Apple
    Apples
    Orange
    Oranges
    Banana
    EOF;
    
    

    $titles = explode("\n", $titles );

    この時点で、 $ titles 文字列の配列である必要があります。次に、マトリックスを作成し、各見出しを他のすべての見出しと比較して類似性を確認します。つまり、5つの見出しの場合、5 x 5のマトリックス(25エントリ)が得られます。ここで、CPUとメモリシンクが使用されます。

    そのため、このメソッド(PHP経由)は数千のエントリに適用できません。ただし、必要な場合:

    $matches = array();
    foreach( $titles as $title ) {
        $matches[$title] = array();
        foreach( $titles as $compare_to ) {
            $matches[$title][$compare_to] = levenshtein( $compare_to, $title );
        }
        asort( $matches[$title], SORT_NUMERIC  );
    }

    この時点で、基本的に持っているのは「テキスト距離」の行列です。概念的には(実際のデータではありません)、次の表のようになります。斜めになる0の値のセットがあることに注意してください。つまり、一致するループでは、2つの同一の単語が同一です。

           Apple Apples Orange Oranges Banana
    Apple    0     1      5      6       6
    Apples   1     0      6      5       6
    Orange   5     6      0      1       5
    Oranges  6     5      1      0       5
    Banana   6     6      5      5       0
    
    

    実際の$matches配列は、次のようになります(切り捨てられます):

    Array
    (
        [Apple] => Array
            (
                [Apple] => 0
                [Apples] => 1
                [Orange] => 5
                [Banana] => 6
                [Oranges] => 6
            )
    
        [Apples] => Array
            (
          ...
    

    とにかく、(実験によって)適切な数値距離カットオフがほとんど一致する可能性があるものを決定し、それを適用するのはあなた次第です。それ以外の場合は、sphinx-searchを読んで使用してください。PHPライブラリが含まれているためです。

    オレンジ、これについて聞いてよかったですか?



    1. 既存のテーブルの列に一意の制約を作成する方法-SQLServer/TSQLチュートリアルパート97

    2. MySQLはテキストエリアから複数の行に挿入します

    3. PostgresqlDROPTABLEが機能しない

    4. SQLでテーブルの行数をカウントする方法