使用MySQL和PHP搜索字符串
我有一个表,比如MySQL中的3个字段。我需要使用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 ."'
<?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
除了在某种程度上简化代码并允许非常大的搜索词集,但可以进行高效搜索外,您还可以将相关性分数反向填充到关键字表中,并使用这些分数生成分数。在单词之间留出一个空格或查找布尔搜索。在单词之间留出一个空格或查找布尔搜索。