php - 如何根据单词优先级的相关性对mysql搜索结果进行排序

标签 php mysql search relevance

Possible Duplicate:
PHP MySQL Search And Order By Relevancy

嗨,

我有一个包含多个列的表,其中包含姓名、地址、公司等字段。假设有人搜索“microsoft john”。我希望包含“microsoft”的结果应该首先出现,然后是包含 john 的结果。反之亦然,如果查询是“john microsoft”

我的 php 代码是:

$searchitems=explode(" ", $trimmed);
//print_r($searchitems);
$so = $_GET['so']=='2'?"2":"1";

$clause = $so=='2'?"AND":"OR";
include("dbconnect.php");
// Build SQL Query

$query = "select FirstName,LastName,course,Department,batch,City,companyjob,companylocation,
    companyposition,coursename,institutename,coursename2,institutename2,coursename3,
    institutename3 from alumni WHERE ";
for($i=0;$i<count($searchitems);$i++)
{
    $queryappend .= "(FirstName LIKE '".$searchitems[$i]."%' OR LastName LIKE '".$searchitems[$i]."%'
    OR City LIKE '".$searchitems[$i]."%' OR CountryorRegion LIKE '".$searchitems[$i]."%'
    OR companyjob LIKE '".$searchitems[$i]."%' OR companylocation LIKE '".$searchitems[$i]."%'
    OR coursename LIKE '".$searchitems[$i]."%' OR institutename LIKE '".$searchitems[$i]."%'
    OR coursename2 LIKE '".$searchitems[$i]."%' OR institutename2 LIKE '".$searchitems[$i]."%')";
    if($i<count($searchitems)-1) $queryappend .= $clause;

}
$query .=$queryappend;

问题是 MYSQL 按 id 对结果进行排序...这很有趣,因为一些更高值(value)的结果可能会卡在堆栈深处。顺便说一句,phpmyadmin 搜索也有同样的缺陷。

请提出建议。

最佳答案

举个例子:

SELECT
  FirstName,
  LastName,
  IF (FirstName LIKE '%Microsoft%' || LastName LIKE '%Microsoft%', 1, 0) AS One,
  IF (FirstName LIKE '%John%' || LastName LIKE '%John%', 1, 0) AS Two
FROM alumni
ORDER BY One DESC, Two DESC

在您的代码中,这将使查询变得非常复杂。优点是,具有两个搜索词的项目出现在仅匹配单个搜索词的项目之前。

另一种方法是在使用 PHP 检索记录时将记录排序到存储桶中。假设您的搜索词位于数组 $search 中(按优先级降序排列):

while ($record = mysql_fetch_array($result))
{
  $total = join(' ', $record);
  $found = false;
  foreach ($search as $term)
  {
    if (strpos($total, $term) !== false)
    {
      $buckets[$term][] = $record;
      $found = true;
      break;
    }
  }
  if (!$found)
  {
    $results[] = $record;
  }
}
foreach (array_reverse($search) as $term)
{
  if (isset($buckets[$term]))
  {
    $result = array_merge($buckets[$term], $result);
  }
}

现在,结果已存储在数组 $results 中。请注意,这演示了算法,但没有针对性能进行调整。

关于php - 如何根据单词优先级的相关性对mysql搜索结果进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4956072/

相关文章:

php - 在 PHP 中屏蔽和分层图像

php - 为什么 css 和 bootstrap 没有在 Laravel 5.3 中加载?

mysql - Pentaho PDI(勺子): MySQL table output very slow (~2000 rows/s)

javascript - 如何使用 JavaScript 创建包含多个可选参数的搜索?

python - 搜索多维数组

PHP - 使用 for 循环而不是 switch 语句

php - 如何向 GuzzleHTTP 请求对象添加身份验证以进行异步处理

python - 使用 .contains() 的 SQLAlchemy 搜索太敏感

php - php中有 "map"函数吗?

python - 无法从在 heroku 上运行的 flask 应用程序连接到 cleardb