1

検索時につづりが間違っていても、データベースを通じてコン​​テンツを検索するクエリを作成するタスクがあるため、strcmp を使用してクエリの soundex を比較しています。現在のコードに問題があります。AZUS、つまり ASUS を検索すると、ASUS のタイトルが表示されません。これは、post_entryASUSでは、以下のコードでこれを行うために a<a href="">ASUS </a>を実行する必要があるためですが、すべてのオプション %s% または %s または s% または s に対してスクリプトが遅くなります。soundex("%'.$arraytagsd.'")%

とにかくsoundexを使用してこれをより速く行う方法はありますか?

検索入力の各単語を取得してデータベースと比較するために、この関数を作成しました

$colname_getPosts = $_GET['post_title'];
mysql_select_db($database_Main);
function test($string) {
    $output = '';
    $arrays = explode(' ', $string);
    foreach ($arrays as $arraytagsd) {
        $output .= ' OR strcmp(soundex(post_title), soundex("%'.$arraytagsd.'%")) = 0';
        $output .= ' OR strcmp(soundex(post_entry), soundex("%'.$arraytagsd.'%")) = 0';
        $output .= ' OR strcmp(soundex(tags), soundex("%'.$arraytagsd.'%")) = 0';
        $output .= ' OR strcmp(soundex(post_author), soundex("%'.$arraytagsd.'%")) = 0';
    }
    return $output;
}

関連性でソートするクエリで使用します

$query_getPosts = "
SELECT post_id, post_date, post_title, post_author, post_entry, tags, sum(relevance)
FROM (
SELECT post_id, post_date, post_title, post_author, post_entry, tags, 10 AS relevance FROM blog_posts WHERE MATCH(post_title) AGAINST('%$colname_getPosts%' IN BOOLEAN MODE)  
UNION
SELECT post_id, post_date, post_title, post_author, post_entry, tags, 2 AS relevance FROM blog_posts WHERE MATCH(post_author) AGAINST('%$colname_getPosts%' IN BOOLEAN MODE)".test($colname_getPosts)." 
UNION
SELECT post_id, post_date, post_title, post_author, post_entry, tags, 5 AS relevance FROM blog_posts WHERE MATCH(post_entry) AGAINST('%$colname_getPosts%' IN BOOLEAN MODE) 
UNION
SELECT post_id, post_date, post_title, post_author, post_entry, tags, 7 AS relevance FROM blog_posts WHERE MATCH(tags) AGAINST('%$colname_getPosts%' IN BOOLEAN MODE))results
GROUP BY post_id, post_date, post_title, post_author, post_entry, tags ORDER BY relevance DESC";
$getPosts = mysql_query($query_getPosts) or die(mysql_error());
$row_getPosts = mysql_fetch_assoc($getPosts);
$totalRows_getPosts = mysql_num_rows($getPosts);
?>
4

1 に答える 1

0

これにはおそらくsolrの使用を検討する必要がありますが、mysqlで実行したい場合は、次のようにします。

  1. この検索を行う列については、別の soundex 列を作成します。いいね:product_name、product_name_soundex。
  2. product_name_soundex を入力するには、コードで一連の作業を行う必要があります: a) 製品名を取得する、b) 名前をトークン化する、c) 各トークンの soundex を計算する (ただし、2 つの metaphone を使用することを検討してください)、d) 保存するproduct_name_soundex の結果の文字列。これは、product_name: Tonka Toy Truck product_name_soundex: T2242 T592 T2321 のようになります。
  3. product_name にフルテキスト インデックスを作成し、product_name_soundex に 1 つ作成します。
  4. _soundex 列を作成したときと同じトークン化アルゴリズムと soundex アルゴリズムを使用するように記述します。
于 2012-09-12T14:37:39.997 に答える