排序SQL结果由一组关键字的occurence(Sort sql result by occuren

2019-10-23 03:02发布

我想为我的网站做一个小的搜索引擎。 首先,在一些关键字的用户类型,并转到导致使用该代码页:

$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);

此代码允许搜索用户请求的关键字和排序$关键字,因此通过关键字组的完整确切字符串...

我想要做的就是命令由每个关键字的最occurence结果。 例如,如果我的SQL结果的行包含5个关键字和其他一个3等5个关键字应该拿出第一。 我正在寻找由多个关键字匹配我的结果进行排序。

希望一切是可以理解的......

帮助将非常感激!

Answer 1:

关于MySQL可爱的东西,这取决于你的观点。 它把它怎么想的,你希望它是处理数据。 1 + '1' ? 很清楚,你要像对待一些字符串,所以它兴高采烈地执行加法为您服务。

工程布尔操作数太(只是看运算符优先级)。 (a like '%foo%') + (a like '%bar%')识别一个数值上下文,对待布尔结果true1和布尔结果false0 -基本上计数关键字为您匹配。

如何使用呢? 把你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

这具有远不及恼人的构建查询严重奖金。

这里的概念,你的证据演示这两种方法。 (虽然只是针对一列 - 但它横跨得到点)



文章来源: Sort sql result by occurence of a set of keywords