【问题标题】:Sort sql result by occurence of a set of keywords根据一组关键字的出现对 sql 结果进行排序
【发布时间】:2015-05-16 07:41:48
【问题描述】:

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

$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 个关键字应该首先出现。我正在搜索按更多匹配的关键字对结果进行排序。

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

非常感谢您的帮助!

【问题讨论】:

  • 或许看看全文索引
  • 我没听懂你的问题 ??..如果用户输入关键字并且输入最多的结果应该排在第一位 ??.那是你的 qus 吗?
  • 您好,用户在发送到搜索页面的表单中选择 $keywords。我正在搜索按更多匹配的关键字对结果进行排序。
  • 全文索引可能是完成此任务的最简单方法,或者您可以如下构建动态order by

标签: php mysql sql sorting keyword-search


【解决方案1】:

关于 MySQL 的美妙之处,取决于您的观点。它会按照您希望的方式处理数据。 1 + '1'?很明显,您希望将字符串视为数字,因此它会愉快地为您执行加法。

也适用于布尔操作数(只需注意运算符优先级)。 (a like '%foo%') + (a like '%bar%') 识别数字上下文,将布尔结果 true 视为 1 并将布尔结果 false 视为 0 - 基本上为您计算关键字匹配。

你怎么能用它?使用您的where 子句,将所有or 替换为+,并确保每个单独的like 语句都用括号括起来,然后是order by

例如:

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

您可以使用fulltext index 完成类似的操作,但权重可能有点奇怪。语法是:

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 演示了这两种方法。 (尽管只针对单个列 - 但它得到了重点)

【讨论】:

    猜你喜欢
    • 2011-11-30
    • 1970-01-01
    • 2013-09-05
    • 2014-12-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2013-08-09
    相关资源
    最近更新 更多