-1

フルテキストがうまく機能しないという理由だけで、フルテキストが本当に嫌いなので、ロングマッチを使用することにしました。このコードの速度を改善する方法があるかどうか疑問に思っていました。私はそれがかさばることと、その 99% ががらくたであることを理解しています。しかし、私が本当に望んでいたのは、テーブル全体を見て、関連性によってこれをソートできるものだけでした.

if (isset($_GET['post_title'])) {
  $colname_getPosts = $_GET['post_title'];
}
mysql_select_db($database_Main);
function test($string){
    $output = '';
$array = explode(' ', $string);
foreach ($array as $arraytags) {$output .= ' OR MATCH(post_title, post_entry, post_author, tags)
AGAINST("%'.$arraytags.'"IN BOOLEAN MODE)'; } 
$array = explode(' ', $string);
foreach ($array as $arraytags) {$output .= ' OR MATCH(post_title, post_entry, post_author, tags)
AGAINST("%'.$arraytags.'%"IN BOOLEAN MODE)'; } 
$array = explode(' ', $string);
foreach ($array as $arraytags) {$output .= ' OR MATCH(post_title, post_entry, post_author, tags)
AGAINST("'.$arraytags.'%"IN BOOLEAN MODE)'; } 
$array = explode(' ', $string);
foreach ($array as $arraytags) {$output .= ' OR MATCH(post_title, post_entry, post_author, tags)
AGAINST("'.$arraytags.'"IN BOOLEAN MODE)'; } 
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";

どうすれば改善できますか、コードは簡単ですか?

4

1 に答える 1

1

毎回同じ配列になるため、4 つの foreach ループを使用して文字列を 4 回展開する必要はありません。

function test($string) {
    $output = '';

    $array = explode(' ', $string);
    foreach ($array as $arraytags) {
        $output .= ' OR MATCH(post_title, post_entry, post_author, tags) AGAINST("%'.$arraytags.'"IN BOOLEAN MODE)';
        $output .= ' OR MATCH(post_title, post_entry, post_author, tags) AGAINST("%'.$arraytags.'%"IN BOOLEAN MODE)';
        $output .= ' OR MATCH(post_title, post_entry, post_author, tags) AGAINST("'.$arraytags.'%"IN BOOLEAN MODE)';
        $output .= ' OR MATCH(post_title, post_entry, post_author, tags) AGAINST("'.$arraytags.'"IN BOOLEAN MODE)';
    }
    return $output;
}

これは、必要以上に配列を 4 回通過することなく、同じことを行います。書式設定には多少の作業が必要です。すべての文字がまとまっており、理解するのが困難でした。

于 2012-07-09T08:07:41.613 に答える