1

これを2つの部分に分けます。

  1. 私には、彼が望む製品の「機能」のリストを持つユーザーがいます。ユーザーは、これらの機能を1から10までランク付けするように求められます。商品がいっぱいのテーブルもあります。これらの各製品にはさまざまな機能があります。一部の製品には1〜10のすべての機能がありますが、一部の製品にはいくつかしかありません。どの製品がユーザーのランキングに最もよく一致するかを判断し、最も一致するものが最初で、最も一致しないものが最後になるように、順序付けられた結果セットをユーザーに提供したいと思います。

  2. 前述のクエリは、実際にはユーザーが行っていることの一部にすぎません。ユーザーは、機能のランク付けとともに、他の検索基準(製品カテゴリ、価格など)も提供しています。そのため、この一連のフィルターを通過する製品にのみ機能マッチングを適用したいと思います。これらをどのように組み合わせるのですか?

私はこれこれのようないくつかの同様の質問を見つけましたが、それらは私の状況にそれらの解決策を適用する方法を理解するのに十分に近いものではありません。

関連するテーブルは次のようになります。

商品(id、product)

機能(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に等しくする必要がある場合は、値に値のすべての再圧縮の合計を掛ける必要があります。たとえば、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 に答える