按一组关键字的出现对结果排序 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
这有一个巨大的好处,那就是构造查询的麻烦要少得多。
Here's a proof of concept for you 演示了这两种方法。 (虽然只针对单个列 - 但它得到了重点)
我正在尝试为我的网站做一个小搜索引擎。 首先,用户输入一些关键字并转到使用此代码的结果页面:
$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
这有一个巨大的好处,那就是构造查询的麻烦要少得多。
Here's a proof of concept for you 演示了这两种方法。 (虽然只针对单个列 - 但它得到了重点)