2017-11-26 6 views
1

私はどのように接近するのか分からない問題があります。「興味があるかもしれない製品」アルゴリズムをSQLで作成しますか?

私は、製品、ユーザー、およびユーザーによる製品の購入を格納するシンプルなデータベースを持っています。 各製品には名前、カテゴリ、価格があります。

私の目標は次のとおりです: 「あなたが興味を持っているかもしれない」と提案されている5つの項目のリストを表示したいのですが、主な問題は単にLIKE% ..名前の%は、しかし、私はまた、ユーザーが通常購入する製品の種類、彼が通常購入する価格帯、およびより頻繁に購入されている製品に優先順位を考慮する必要があります。

このようなアルゴリズムは現実的ですか?すべてのカテゴリを意味的に「類似」のバケットにグループ化し、そこから距離を計算するなど、いくつかのメトリックを考えることはできますが、複数の基準がある場合にどのようにランク付けするべきかはわかりません。

多分、私は各基準に重要な要素を与え、その結果を距離*の倍数にする必要がありますか?

+0

? – Blag

+0

これは実際にSpringのデータ+ JPAプロジェクトのためですが、それは混乱ですので、MySql/MariaDBだとしましょう。 – dac1n

+0

これは古典的なデータ科学のタイプの問題です。 – Paparazzi

答えて

1

できることは、データベース内の各製品に2つの追加フィールドを作成することです。たとえば、「タイプ」と呼ばれる最初のフィールドでは「RC」と言い、2番目のフィールドでは「RC、ラジオ、エレクトロニクス、リモート、モデル」と言うことができます。SQLで後で選択するように指示できますタイプとそれに類するものとの間で一致する製品。これは、製品名に依存していないシステムを提供します。これらは、欺かれる可能性があるためです。これはまだLIKEコマンドを使用していますが、他のどの製品がこれに類似しているかについて事前に定義されているので、はるかに正確です。

データベースのサイズによっては、これが最も簡単なオプションだと思います。

1

私はいくつかの加重検索用のMySQLでこれを使用していた:あなたは、特定のDBMSに取り組んでいる

SELECT *, 
    IF(
     `libelle` LIKE :startSearch, 30, 
     IF(`libelle` LIKE :fullSearch, 20, 0) 
    ) 
    + IF(
     `description` LIKE :startSearch, 10, 
     IF(`description` LIKE :fullSearch, 5, 0) 
    ) 
    + IF(
     `keyword` LIKE :fullSearch, 1, 0 
    ) 
    AS `weight` 
FROM `t` 
WHERE (
    -- at least 1 match 
    `libelle` LIKE :fullSearch 
    OR `description` LIKE :fullSearch 
    OR `keyword` LIKE :fullSearch 
) 
ORDER BY 
     `weight` DESC 

/* 
'fullSearch'=>'%'.str_replace(' ', '_', trim($search)).'%', 
'startSearch'=>str_replace(' ', '_', trim($search)).'%', 
*/ 
関連する問題