更好地排序mysql/php搜索结果


Better ordering of mysql/php search results

我有一个mysql.php查询,它在数据库中搜索,并根据用户输入的搜索字符串返回匹配项,它是按标题升序排序的,但我们真的希望它按最佳匹配排序(类似于ElasticSearch用分数对搜索结果进行排名的方式)。

目前,当搜索"地震II"时,结果列表看起来像:

- Quake
- Quake 4
- Quake II
- Quake III Arena

预期结果列表必须为:

- Quake II (corresponding exactly to the search)
- Quake III Arena (containing entirely the search)
- Quake
- Quake 4

当前的php/mysql查询是:

$nameKeys = explode(" ", $gamenamethathasbeensearchedfor);
$query = "SELECT id FROM games WHERE GameTitle LIKE '%$nameKeys[0]%'";
for($i = 1; $i <= count($nameKeys); $i++)
{
    if($nameKeys[$i] != "" || $nameKeys[$i] != " " || $nameKeys[$i] != "  " || $nameKeys[$i] != "   ")
    {
        $query .= " AND GameTitle LIKE '%$nameKeys[$i]%'";
    }
}

我会在GameTitle上设置一个FullText索引,然后您就可以利用MySQL的全文排序功能,而不必编写一些复杂的查询。也就是说,如果您没有使用InnoDB。你也可以这样做,

SELECT id, MATCH (GameTitle) AGAINST ('%$nameKeys[$i]%') AS SCORE FROM games WHERE MATCH (GameTitle) AGAINST ('%$nameKeys[$i]%') limit 10;

这应该可以让你在不修改索引的情况下非常接近,但我建议你查看MySQL全文函数