【问题标题】:Laravel - Sorting based on number of occurrences of a word?Laravel - 根据单词的出现次数排序?
【发布时间】:2021-12-06 09:37:41
【问题描述】:

我有这个查询返回包含search 字的产品。如何根据search 单词的出现次数对它们进行排序?

$products = Product::where('name','LIKE','%'.$search.'%')
                ->orWhere('name', 'like', '%' . str_replace(' ', '-', $search) . '%')
                ->orWhere('features','LIKE','%'.$search.'%')->get();

我有 SQL 查询,但我不知道如何将它与上面的查询结合起来:

SELECT *,
(LENGTH(`name`) - LENGTH(REPLACE(`name`, $search, ''))) / LENGTH('test') `appears_in_text`,

(LENGTH(`features`) - LENGTH(REPLACE(`features`, $search, ''))) / LENGTH($search) `appears_in_subject`,

(LENGTH(CONCAT(`name`,' ',`features`)) - LENGTH(REPLACE(CONCAT(`name`,' ',`features`), $search, ''))) / LENGTH($search) `occurences`
 FROM 
`products`
 WHERE (name LIKE $search OR features LIKE $search)
ORDER BY `occurences`  DESC

【问题讨论】:

    标签: mysql laravel


    【解决方案1】:

    您可以做的一件事是事后对它们进行排序。这可以通过根据搜索字符串中出现的单词数对每个产品进行评分来完成。

        $searchWords = array_filter(explode(' ', trim($search)));
        $matchPoint = 100/sizeof($searchWords);
    
    
        foreach ($products as $product) {
    
                $match = 0;
    
                foreach ($searchWords as $word) {
    
                    if(str_contains(strtolower($product->name), strtolower($word)) ) {
    
                        $match +=  $matchPoint;
                    }
                }
    
                $product->match = $match;
    
            }
    
    //then sort by highest rated
    
    $sortedProducts = $products->sort(function ($a, $b) {
    
                if ($a->match > $b->match) {
                    return -1;
                }
                if ($a->match < $b->match) {
                    return 1;
                }
                return 0;
            });
    
    return $sortedProducts->values();
    

    我知道这不是最有效的,但它会完成工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-25
      • 1970-01-01
      • 2012-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-28
      相关资源
      最近更新 更多