通过出现一组关键字对sql结果进行排序

时间:2015-05-16 07:41:49

标签: 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);

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

我尝试做的是按每个关键字最常见的顺序排序结果。 例如,如果我的sql结果的一行包含5个关键字而另一个包含3个等等,那么首先应该出现5个关键字。我正在搜索通过匹配更多关键字对结果进行排序。

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

非常感谢帮助!

1 个答案:

答案 0 :(得分: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演示了这两种方法。 (虽然只针对一个列 - 但它得到了重点)