按出现的一组关键字对sql结果排序


Sort sql result by occurence of a set of keywords

我想为我的网站做一个小搜索引擎。首先,用户输入一些关键字,然后进入使用以下代码的结果页面:

$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'吗?很明显,您希望将字符串视为数字,因此它很高兴地为您执行加法。

也适用于布尔操作数(只需要注意操作符优先级)。(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

这有一个严重的好处,那就是为。

构造查询时少了很多烦恼。

这里有一个概念证明,演示了这两种方法。(虽然只针对单个列-但它可以传达要点)