我在MySQL中有一个表3个字段。我需要使用PHP搜索字符串 我的代码就像
<?PHP
//SET THE SEARCH TERM
$term = "Search Term";
//QUERY THE TITLE AND CONTENT COLUMN OF THE PAGES TABLE RANK IT BY THE SCORE
$sql = "SELECT *, MATCH(title, content) AGAINST('". $term ."') as score FROM pages WHERE MATCH (title, content) AGAINST('". $term ."') ORDER BY score DESC";
$query = mysql_query($sql);
//BUILD A LIST OF THE RESULTS
while($result = mysql_fetch_assoc($query)) {
echo("{$result['title']} - {$result['score']}");
}
?>
在这里,它搜索了完全在数据库中的单个单词。 我需要搜索多个单词。如何更改上面的代码。 有人可以提出一些想法。
答案 0 :(得分:1)
MATCH (title,content) AGAINST ('Search Term' IN BOOLEAN MODE)
将搜索其中一个单词
MATCH (title,content) AGAINST ('+Search +Term' IN BOOLEAN MODE)
会搜索两个单词
MATCH (title,content) AGAINST ('-Search +Term' IN BOOLEAN MODE)
将搜索不带搜索的术语
只需拆分单词并使用+ - |构建它,无论需要什么。
检查文档:http://dev.mysql.com/doc/refman/5.5/en/fulltext-boolean.html
答案 1 :(得分:0)
您可以将布尔模式开关添加到匹配项中 - 但这不会按相关性对结果进行排序。
你可以尝试像......
$words=explode(' ', $term);
$score='CASE ';
$filter=array();
foreach ($words as $try_word) {
$score.="WHEN MATCH(title, content) AGAINST('$try_word') THEN 1 ";
$filter[]="MATCH(title, content) AGAINST('$try_word')";
}
$score.="ELSE 0 END CASE";
$qry="SELECT SUM(SCORE), " . ** add explicit list of fields here **
. " FROM pages WHERE (" . implode(' OR ', $filter) . ")"
. " GROUP BY " . ** add explicit list of fields here **
. " ORDER BY 1 DESC";
请注意,这突出了mysql中的全文搜索不是解决问题的理想方法的问题 - 更好的方法是实现一个单独的提取关键字表和一组临时搜索词,并对所有搜索词执行查询三个表:
SELECT COUNT(*) as matched_fields, " . ** add explicit list of fields from page table here ** . "
FROM pages p, keywords k, search_terms s
WHERE k.word=s.word
AND s.session_id='" . some_session_or_request_identifier() . "'
AND k.page_id=p.id
GROUP BY " . ** add explicit list of fields from page table here ** . "
ORDER BY 1 DESC
除了稍微简化代码并允许非常大的搜索词集但高效搜索之外,您还可以将相关性分数反馈到关键字表中,并使用它们来生成分数。