搜索查询和排序匹配与我的sql


Search query and ordering by matches with my sql

我目前被困在这里,一直在研究如何编写一个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')