You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel商品搜索结果按最佳匹配排序的实现方法咨询

实现Laravel商品搜索结果的最佳匹配排序

我来帮你搞定这个搜索结果排序的问题!核心思路是给不同匹配程度的商品计算权重得分,让最贴合用户搜索意图的商品排在最前面,具体方案如下:

匹配优先级与得分规则

我们按照用户搜索的贴合度从高到低给商品打分:

  • 完全匹配商品名称(和搜索关键词完全一致):权重最高(+3分)
  • 包含完整搜索关键词(比如搜"abc def",商品名里完整出现"abc def"):权重次之(+2分)
  • 包含拆分后的单个关键词(比如搜"abc def",商品名包含"abc"或"def"):每个匹配的词加1分

最终按总得分降序排序,得分越高的商品越靠前。

修改后的完整代码

list($type, $search) = explode(":", $key);
$searchValues = preg_split('/\s+/', $search, -1, PREG_SPLIT_NO_EMPTY);

// 构建得分计算的SQL片段和绑定参数(避免SQL注入)
$scoreCalculation = "0";
$bindParams = [];

// 1. 完全匹配商品名称加3分
$scoreCalculation .= " + (CASE WHEN product_name = ? THEN 3 ELSE 0 END)";
$bindParams[] = $search;

// 2. 包含完整搜索关键词加2分
$scoreCalculation .= " + (CASE WHEN product_name LIKE ? THEN 2 ELSE 0 END)";
$bindParams[] = "%{$search}%";

// 3. 每个拆分的关键词匹配加1分
foreach ($searchValues as $value) {
    $scoreCalculation .= " + (CASE WHEN product_name LIKE ? THEN 1 ELSE 0 END)";
    $bindParams[] = "%{$value}%";
}

$products = ProductDetail::join('product_brands', 'product_details.brand_id', 'product_brands.id')
    ->select('brand_name as manufacturer', 'product_availability as isInStock', 'product_details.*', 'product_price as displayPrice')
    ->where(function ($q) use ($searchValues, $search) {
        $q->where('product_name', 'like', "%{$search}%");
        foreach ($searchValues as $value) {
            $q->orWhere('product_name', 'like', "%{$value}%");
        }
    })
    // 按得分降序排序,得分相同可追加其他排序规则(比如价格、销量)
    ->orderByRaw($scoreCalculation . " DESC", $bindParams)
    ->paginate(5);

关键细节说明

  1. 安全的参数绑定:所有查询参数都通过绑定方式传递,避免直接拼接字符串带来的SQL注入风险。
  2. 自定义排序逻辑:通过orderByRaw执行我们的得分排序规则,确保最匹配的商品优先展示。如果得分相同,你可以根据业务需求追加额外排序条件(比如->orderBy('product_price', 'asc'))。
  3. 灵活调整权重:如果你觉得得分规则不合适,可以随时修改CASE WHEN里的分数,比如把完全匹配的权重调到5分,根据用户实际使用情况优化。

额外优化建议

如果你的商品数据量很大,基于LIKE的查询效率会偏低,可以考虑引入MySQL全文索引,结合MATCH AGAINST语法实现更高效的搜索和排序,这在数据量增长后会带来明显的性能提升。

内容的提问来源于stack exchange,提问作者Atanu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:07:12