我目前被困在这里,一直在研究如何编写一个mysql语句灵活搜索产品,并在我工作的一个项目上通过相关性订购它们已经看到了一些,但没有帮助,请我需要帮助如何使其工作,我目前的方法不工作,这里是。
用户在搜索栏输入并提交"iPad 3rd Generation"。我的脚本将字符串分解为如下的单词:
$termsExploded = array_unique(explode(' ', $term));
不,我使用php根据找到的单词数创建一个sql查询。
$i = 0;
foreach ($termsExploded as $word) {
if (strlen($word)>1) {
if ($i == 0) {
$where_query = $where_query." name LIKE '%".$word."%'";
}
else{
$where_query = $where_query." OR name LIKE '%".$word."%'";
}
$i++;
}
}
where查询变量现在看起来是这样的:
name Like '%ipad%' Or name Like '%3rd%' Or name Like '%Generation%'
现在像这样搜索产品id。
$IDs = "SELECT DISTINCT id FROM store_items WHERE".$where_query;
我现在根据返回的id创建第二个查询,如下所示
$where_query_s = null;
$i = 0;
foreach ($IDs as $result) {
$returnID = $result->id;
if ($i == 0) {
$where_query_s = $where_query_s." id = ".$returnID."";
}
else{
$where_query_s = $where_query_s." OR id = ".$returnID."";
}
$i++;
};
现在我根据返回的不同id再次选择产品,如下所示
$items = "SELECT * FROM store_items WHERE".$where_query_s;
现在这可以获得产品,但是我如何根据最佳匹配对其进行排序?
假设您想按匹配的数量排序,然后按如下方式构建另一个字符串:-
ORDER BY IF(name Like '%ipad%', 1, 0) + IF(name Like '%3rd%', 1, 0) + IF(name Like '%Generation%', 1, 0) DESC
但是这将是缓慢的,并且不考虑索引来提高性能,也不考虑复数/单数(即,如果有人搜索'flies',它不会正确排名'fly')。
在代码中添加更多内容:-
$where_query = array();
$order_query = array();
foreach ($termsExploded as $word)
{
if (strlen($word)>1)
{
$where_query[] = " name LIKE '%".$word."%'"
$order_query[] = " IF(name Like '%".$word."%', 1, 0)"
}
}
$IDs = "SELECT DISTINCT id FROM store_items WHERE ".implode(' OR ', $where_query)." ORDER BY ".implode(' + ', $order_query)." DESC";
让你的查询看起来像这样:
select field1, field2, etc, count(*) records
from store_items
where blah blah blah
group by field1, field2, etc
order by records desc
如果表是基于MyISAM的,或者是InnoDB的,并且版本是Mysql 5.6或更高,那么你可以使用全文搜索(参见http://dev.mysql.com/doc/refman/5.6/en/fulltext-search.html)
实际上你想要一个类似于
的查询 SELECT * FROM store_items WHERE MATCH (name) AGAINST ('iPad 3rd Generation')
ORDER BY MATCH (name) AGAINST ('iPad 3rd Generation')