0

シナリオ:次のクエリを使用して、特定のカテゴリのProductNameとDescriptionの2つの列でMySqlテーブルを検索しています。

$query = "SELECT * FROM Products WHERE MATCH(ProductName,Description) AGAINST ('+$terms[0]* +$terms[1]* +$terms[2]* +$terms[3]* +$terms[4]*' IN BOOLEAN MODE) AND category_description='".$search_dept."' OR MATCH(ProductName,Description) AGAINST ('+$terms[0]* +$terms[1]* +$terms[2]* +$terms[3]* +$terms[4]*' IN BOOLEAN MODE) AND category2='".$search_dept."' ORDER BY $orderby LIMIT $offset, $rowsPerPage";

検索条件$terms[x]は、フォームのテキスト入力フィールドからのものであり、次を使用してフォーマットされています。

$slash_term = addslashes($_POST['term']);
$var = @$slash_term;
$trimmed = trim($var);
$terms = explode(' ',$trimmed);

ストップワードを使用するまでルーチンはうまく機能し、その後、明らかにクエリは強制終了されます。

共有サーバーを使用していますが、ストップワードチェックを無効にできません。したがって、私が調査してきたことから、この問題を回避するためにLIKEと%ワイルドカードを使用できる可能性があります。

したがって、上記のクエリをLIKEクエリに変換するにはどうすればよいでしょうか。次のようなものになると思いますが、機能していません。

    $query = "select * from Products where category_description='".$search_dept."' AND Description like \"%$trimmed%\" OR category_description='".$search_dept."' AND ProductName like \"%$trimmed%\" ORDER BY $orderby LIMIT $offset, $rowsPerPage";

そして、%$ triggered%を使用するだけで、ワイルドカード化された検索フレーズから個々の単語を取得できますか?それとも、それは私がそれについて行くべき方法でさえありますか?ほとんどの場合、検索には複数の単語が含まれます。

最初のクエリはほぼ完璧に機能するように見えるので、ユーザーの入力でストップワードをチェックするサブルーチンを追加し、検索する前にフレーズからそれらを削除するだけの価値はありますか?

4

1 に答える 1

1

さて、これが私の解決策です。ユーザーの入力からストップワードを確認して削除し、元の検索クエリに進みます。完璧に動作します。

// format user's input
$slash_term = addslashes($_POST['term']);
$var = @$slash_term;
$trimmed = trim($var);
$terms = explode(' ',$trimmed);
// check for stop words and remove
$stop_words_file  = "list-of-english-stop-words.txt"; // load stop words file
$contents = addslashes(file_get_contents($stop_words_file)); // escape special characters
$stop_words = explode(',', $contents); // create array
foreach($terms as $key => $value) { // search user input for stop words
    if(in_array($value, $stop_words)) { // stop word found
        unset($terms[$key]); // remove it from array
    }
}
$terms = array_values($terms); // remove empty/NULL values from array
// perform search
$query = "SELECT * FROM Products WHERE MATCH(ProductName,Description) AGAINST ('+$terms[0]* +$terms[1]* +$terms[2]* +$terms[3]* +$terms[4]*' IN BOOLEAN MODE) AND category_description='".$search_dept."' OR MATCH(ProductName,Description) AGAINST ('+$terms[0]* +$terms[1]* +$terms[2]* +$terms[3]* +$terms[4]*' IN BOOLEAN MODE) AND category2='".$search_dept."' ORDER BY $orderby LIMIT $offset, $rowsPerPage";
于 2013-02-15T17:06:58.687 に答える