使用MySQL和PHP搜索字符串

时间:2011-03-30 12:40:34

标签: php mysql

我在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']}");
    }

?>

在这里,它搜索了完全在数据库中的单个单词。 我需要搜索多个单词。如何更改上面的代码。 有人可以提出一些想法。

2 个答案:

答案 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

除了稍微简化代码并允许非常大的搜索词集但高效搜索之外,您还可以将相关性分数反馈到关键字表中,并使用它们来生成分数。