Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用MySQL和PHP搜索字符串_Php_Mysql - Fatal编程技术网

使用MySQL和PHP搜索字符串

使用MySQL和PHP搜索字符串,php,mysql,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 ."'

我有一个表,比如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']}");
    }

?>

将搜索其中一个单词

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)
将搜索这两个词

MATCH (title,content) AGAINST ('-Search +Term' IN BOOLEAN MODE)
你会不搜索就搜索这个词吗

只需拆分单词并使用+-|构建它,无论需要什么


查看文档:

您可以将布尔模式开关添加到匹配中,但这不会按相关性对结果进行排序

你可以试试像

$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

除了在某种程度上简化代码并允许非常大的搜索词集,但可以进行高效搜索之外,您还可以将相关性分数反向填充到关键字表中,并使用这些分数生成分数。

您可以将布尔模式开关添加到匹配项中,但这不会按相关性对结果进行排序

你可以试试像

$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

除了在某种程度上简化代码并允许非常大的搜索词集,但可以进行高效搜索外,您还可以将相关性分数反向填充到关键字表中,并使用这些分数生成分数。

在单词之间留出一个空格或查找布尔搜索。在单词之间留出一个空格或查找布尔搜索。