我想知道如何计算用户提交的单词在我的MySQL数据库中存储的文章中出现的次数,然后显示从最高到最低出现的结果。
这是我的PHP&下面的MySQL代码。
$x = 0;
$con = null;
$search = $_REQUEST['search'];
$search_explode = mysqli_real_escape_string($dbc, $search);
$search_explode = explode(' ', $search_explode);
foreach($search_explode as $search_each) {
$x++;
if($x == 1){
$con .= " article_content LIKE '%$search_each%' OR title LIKE '%$search_each%' OR summary LIKE '%$search_each%'";
} else {
$con .= " OR article_content LIKE '%$search_each%' OR title LIKE '%$search_each%' OR summary LIKE '%$search_each%'";
}
}
$con = "SELECT users.*, users_articles.* FROM users_articles
INNER JOIN users ON users_articles.user_id = users.user_id
WHERE ($con)
AND users.active IS NULL
AND users.deletion = 0";
$run = mysqli_query($dbc, $con);
$search_term = mysqli_num_rows($run);
答案 0 :(得分:1)
将文章作为字符串存储在某个变量中后,可以使用substr_count
查找特定字符串的出现次数。
如果您需要有关文章中使用的单词的一般信息,可以使用str_word_count
获取字符串中所有单词的列表,然后使用它。
答案 1 :(得分:0)
您希望在字符串中找到所有出现的单词:
<?php
function findall($needle, $haystack)
{
//Setting up
$buffer=''; //We will use a 'frameshift' buffer for this search
$pos=0; //Pointer
$end = strlen($haystack); //The end of the string
$getchar=''; //The next character in the string
$needlelen=strlen($needle); //The length of the needle to find (speeds up searching)
$found = array(); //The array we will store results in
while($pos<$end)//Scan file
{
$getchar = substr($haystack,$pos,1); //Grab next character from pointer
if($getchar!="\n" || buffer<$needlelen) //If we fetched a line break, or the buffer is still smaller than the needle, ignore and grab next character
{
$buffer = $buffer . $getchar; //Build frameshift buffer
if(strlen($buffer)>$needlelen) //If the buffer is longer than the needle
{
$buffer = substr($buffer,-$needlelen);//Truncunate backwards to needle length (backwards so that the frame 'moves')
}
if($buffer==$needle) //If the buffer matches the needle
{
$found[]=$pos-$needlelen+1; //Add the location of the needle to the array. Adding one fixes the offset.
}
}
$pos++; //Increment the pointer
}
if(array_key_exists(0,$found)) //Check for an empty array
{
return $found; //Return the array of located positions
}
else
{
return false; //Or if no instances were found return false
}
}
?>
来自http://php.net/manual/en/function.strstr.php
...
另一个:
<?php
function find_occurences($string, $find) {
if (strpos(strtolower($string), strtolower($find)) !== FALSE) {
$pos = -1;
for ($i=0; $i<substr_count(strtolower($string), strtolower($find)); $i++) {
$pos = strpos(strtolower($string), strtolower($find), $pos+1);
$positionarray[] = $pos;
}
return $positionarray;
}
else {
return FALSE;
}
}
答案 2 :(得分:0)
使用全文搜索非常简单。例如:
SELECT *,
MATCH(title, body) AGAINST ('PHP') AS score
FROM articles
WHERE MATCH(title, body) AGAINST('PHP')
根据MySQL手册,全文是一种“自然语言搜索”;它使用您指定的列索引表示该行的单词。例如,如果您的所有行都包含“MySQL”,那么“MySQL”将不会匹配太多。它不是非常独特,它会返回太多结果。但是,如果只有5%的行中存在“MySQL”,那么它将返回这些行,因为它不会经常出现,因为它不常被称为非常常见的关键字。 (如果你的行中没有“MySQL”,那么它什么都不返回;呃。)
MySQL也做了一些非常有用的事情。它创造了一个分数。此分数通常类似于.9823475或.124874,但始终大于零。它的范围可以超过1,我有时会看到4。 (不要试图将它乘以100并将其描绘为%值;人们会想知道为什么他们的关键字匹配431%的文章!)
MySQL也将按其得分排序,降序。
另一个有用的消息:如果您使用MATCH()AGAINST()在查询中将此文档样式更改为“内联代码”两次,就像我们一样,没有额外的速度惩罚。您可能期望因为您执行相同的搜索两次,查询将花费两倍的时间,但实际上MySQL会记住第一次搜索的结果,因为它运行第二次搜索。
要了解详情,请参阅:http://devzone.zend.com/article/1304