首页 > 解决方案 > 关于搜索查询

问题描述

我是网络开发的新手。我有一个关于搜索结果的任务。

如果有人在我的网站上搜索“God is Great with us”,如果此字符串完全匹配,我希望结果首先显示“God is Great with us”,然后显示“god”相关名称产品(如果有),然后显示“great”相关名称产品(如果有),然后“与”相关名称产品(如果有)

我们必须丢弃少于 2 个字符。

我有 laravel 5.5 和 phpmyadmin pdo

我尝试了什么:

$search="God is Great with us"
$multiSearch  = explode(" ", $search);
$multiSearch1 = [];
foreach ($multiSearch as $work) {
    if (strlen($work) <= 2) {
        continue;
    } else {
        $multiSearch1[] = $work;
    }
}

array_unshift($multiSearch1, $search);
foreach ($multiSearch1 as $term) {
    $query->orWhere('name', 'like', '%' . strtoupper($term) . '%');
}
return $query;

但我的结果没有按正确的顺序显示

使用“strtoupper 函数”,因为它的名称以大写形式保存

标签: phplaravel

解决方案


如果我理解您的问题,那么问题是您想从整个短语开始对结果进行排名。问题是 MySQL 不会以任何保证的顺序返回结果。那是...

SELECT last_name FROM customers WHERE last_name LIKE 'A%' OR last_name LIKE 'B%' OR last_name LIKE 'C%';

...可能会回来...

last_name
---------
Babu
Agarwal
Chabra

要获得您想要的顺序,您需要使用一系列 UNION 查询来确保正确的顺序,如下所示:

$words = explode(" ", $search);
$multiSearch=[];
foreach($words as $word){
    if(strlen($word)<=2){
        continue;
    } else {
        $multiSearch[]=$word;
    }
}

// Start the query with the whole search term
$query = DB:table('products')
    ->select(DB:raw('1 as displayOrder, name')
    ->where('name', 'like', '%' . strtoupper($search) . '%');

$displayOrder=2;
foreach ($multiSearch as $term){
    // Make a new query for each word, each with a greater display order
    $wordQuery = DB:table('products')
        ->select(DB:raw($displayOrder . ' as displayOrder, name');

    // Add this word's query to the main query
    $query->union('$wordQuery');
    $displayOrder++;
}

// This query will now be a union of each search, ordered as you wish
$query->orderBy(displayOrder', 'name');

推荐阅读