1

我将把它分成两部分:

  1. 我有一个用户列出了他想要的产品“功能”。要求用户从 1-10 对这些特征进行排名。我还有一张摆满产品的桌子。这些产品中的每一个都有不同的功能。有些产品将具有 1-10 的所有功能,但有些产品只有其中的几个。我想确定哪个产品与用户的排名最匹配,并为用户提供一个有序的结果集,最好的匹配在前,最差的匹配在后。

  2. 上述查询实际上只是用户正在做的事情的一部分。用户还提供其他搜索标准(例如产品类别、价格等)以及特征排名。因此,我希望功能匹配仅适用于通过这组过滤器的产品。我将如何结合这些?

我发现了一些类似的问题thisthis,但它们还不够接近,我无法弄清楚如何将这些解决方案应用于我的情况。

涉及的表如下所示:

产品(ID,产品)

特征(id,特征)

product_features (id, product_id, feature_id)

并且用户将通过这样的数组提交他的搜索(其中键实际上是特征 ID,排名是值):

[users_features] => Array
    (
        [1] => Array
            (
                [rank] => 9
            )

        [2] => Array
            (
                [rank] => 1
            )

        [3] => Array
            (
                [rank] => 3
            )

(现在这将是一个 10 项数组,但将来可能会改变)

    )
4

2 回答 2

0

我不能完全使用 SQL 来让它工作,但一个简单的 PHP 解决方案将类似于以下(未经测试):

//Array of $productId => list of feature ids
$products;
$userFeatures;
$scores = array();
//For every product work out a score based on features and user ranking.
foreach($products as $productId => $prodFeatures){
    $score = 0;
    foreach($prodFeatures as $feature){
        //Could also perhaps penalise products lacking features.
        $score += $userFeatures[$feature]["rank"];
    }
    $scores[$productId] = $score;
}
arsort($scores);
echo "Best match is ".$scores[0];

显然这有点粗糙和准备好,但希望它有所帮助。

编辑:这假设 10 的排名是最好的。

于 2012-12-12T22:17:08.037 回答
0

一种解决方案是将 1 除以用户等级。例如 1/R。然后总结所有可能性并按后代顺序对列表进行排序。1/R 也是不从列表中选择该产品的机会。当您需要对值进行归一化或使值的总和等于 1 时,您需要将该值乘以这些值的所有 reziprokes 的总和。例如 r1=30 和 r2=15。1/(1/30 + 1/15) = 10,所以 P1 = 10 * 1/30 = 1/3 和 P2 = 10 * 1/15 = 2/3。当您将值标准化时,这也意味着具有较少属性的产品也不太可能。

于 2012-12-12T22:22:21.387 回答