php - 根据一组关键字的出现对sql结果进行排序

标签 php mysql sql sorting keyword-search

我正在尝试为我的网站做一个小搜索引擎。 首先,用户输入一些关键字并转到使用此代码的结果页面:

$result = array();
$keyword_tokens = explode(' ', $keywords);
$keyword_tokens = array_map(
    function($keywords) {
        return mysql_real_escape_string(trim($keywords));
    }, 
    $keyword_tokens
);
$sql = "SELECT * FROM search_table WHERE concat(title, description) LIKE '%";
$sql .= implode("%' OR concat(title, description) LIKE '%", $keyword_tokens) . "%' ORDER BY instr(description, '$keywords') DESC, instr(title, '$keywords') DESC";
$result=mysql_query($sql);

此代码允许搜索用户请求的关键字并按 $keywords 排序,因此按关键字组的完整精确字符串...

我想做的是按每个关键字出现次数最多的顺序对结果进行排序。 例如,如果我的 sql 结果的一行包含 5 个关键字,而其他行包含 3 个等。这 5 个关键字应该首先出现。我正在搜索以根据匹配的更多关键字对结果进行排序。

希望一切都可以理解...

非常感谢您的帮助!

最佳答案

关于 MySQL 的可爱之处,取决于您的观点。它按照您希望的方式处理数据。 1 + '1'?很明显,您希望将字符串视为数字,因此它很乐意为您执行加法运算。

也适用于 bool 操作数(只需要注意运算符的优先级)。 (a like '%foo%') + (a like '%bar%') 识别数字上下文,将 bool 结果 true 视为 1 和 bool 结果 false0 - 本质上是为您计算关键字匹配。

如何使用它?使用你的 where 子句,将所有 or 替换为 +,并确保每个单独的 like 语句都包含在括号,然后 order by 它。

例如:

order by (concat(title, description) like '%keyword1%') 
  + (concat(title, description) like '%keyword2%') desc

您可以使用全文索引 完成类似的事情,但权重可能有点奇怪。语法为:

create fulltext index idx on search_table(title, description)

^^ 只做一次。

select *
  from search_table
  where match(title, description) against ('keyword1 keyword2 ...')
  order by match(title, description) against ('keyword1 keyword2 ...') desc

这有一个巨大的好处,那就是构造查询的麻烦要少得多。

Here's a proof of concept for you演示了这两种方法。 (尽管只针对单个列 - 但它得到了重点)

关于php - 根据一组关键字的出现对sql结果进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30273092/

相关文章:

php - mariaDB-无法连接 php/页面只是空白

php - 合并数组,将值相加

php - 对于大数据集,哪个更快? mysql、mysqli 还是 PDO?

mysql - 抛出“不是数组引用”错误

php - MySQL - 如何获得具有准确相关性的搜索结果

php - 将多个变量输入表中,分配给每个适当的记录

php - 使用 PHP 更新 MySQL

mysql - 如何避免在nodejs中重复的sql连接代码并使用.env文件代替

Java:从现有表生成 CREATE TABLE 代码

php - 使用 phpmyadmin 的 MySQL 触发器