1

検索ボックスに入力されたキーワードに基づいてデータベース エントリを検索するためのこのクエリがあります。

// function to get search keywords from url
$q = furl($_GET['q']);

$sExp = preg_split('/\s+/',$q); 
$secure_keywords = array(); 
foreach ($sExp as $key=>$keyword){
    if (strlen($keyword) >= 3){ 
    // cut off words that are less than 3 chars
    $secure_keywords[] = $keyword;
    }
}
$kwords = count($secure_keywords); 
foreach ($secure_keywords as $key=>$keyword) 
{ 
// function to prevent sql injection
$keyword = sql_proof($keyword); 

$query="SELECT * FROM listings WHERE MATCH (meta_keywords) AGAINST ('$keyword' IN BOOLEAN MODE) ORDER BY id"; 
} 

2 つ以上の単語が使用されている場合、少なくとも 1 つの単語のスペルが間違っていると、クエリは結果を返しません (入力したキーワードの残りの単語に対して結果が存在する場合でも)。たとえば、「良い」という単語を入力すると、少なくとも 1 つの結果が得られますが、「良い点」を使用すると、クエリは結果を返さないため、「良い」という単語に一致する結果は完全に無視されます。入力したキーワードに少なくとも 1 つの一致する単語がある場合、クエリが結果と一致する方法はありますか? ありがとう

4

2 に答える 2

0

使用されているキーワードのいずれかと結果を一致させる方法については、以下の解決策を確認してください。演算子とブール fst の詳細については、ドキュメントも確認してくださいhttp://dev.mysql.com/doc/refman/5.1/en/fulltext-boolean.html

// function to get search keywords from url
$q = furl($_GET['q']);

$sExp = preg_split('/\s+/',$q); 
$secure_keywords = array(); 
foreach ($sExp as $key=>$keyword){
    if (strlen($keyword) >= 3){ 
    // cut off words that are less than 3 chars
    $secure_keywords[] = $keyword;
    }
}
$kwords = count($secure_keywords); 

//init empty keywords array
$keywords = array();

//secure all keywords
$keywords = array_map(function($item){ return sql_proof($item); }, $secure_keywords); 

//implode the words with a space between
$keywords = implode(" ",$keywords);

//just one query with match against ANY of the words from initial keyword array
$query="SELECT * FROM listings WHERE MATCH (meta_keywords) AGAINST ('$keywords' IN BOOLEAN MODE) ORDER BY id"; 
于 2013-11-23T17:37:25.950 に答える
0

「ブールモードで」を使用する代わりに試してください

SELECT * FROM articles WHERE MATCH (title, body) AGAINST ('database test')

データベースの後に「テスト」などの単語がなくても結果を返します

SELECT * FROM tablename WHERE MATCH (col1, col2) AGAINST ('string to be searched')
于 2013-10-21T10:07:59.000 に答える