2

ユーザーの車両 (車、オートバイ) を保持するデータベース テーブルがあります。そのテーブルから最も類似した車両を取り出したいと思います。テーブルに次の列が含まれているとします (アイデアを得るためにいくつかのコンテキストを使用します)。

table: vehicles


vehicle_id (pk, auto-increment)
model_id (BMW 3er, Honda Accord)
fuel_type (gasoline, diesel)
body_style (sedan, coupe)
year
engine_size (2.0L)
engine_power (150hp)

つまり、同じ make_id (少なくとも) を持つ N (通常は 3) 行を選択し、それらがシード ビークルと共有する類似性の量によってランク付けしfuel_typeたいと考えています。一致した場合、ランク ポイント +3 が得られます。 、しかし、body_style一致する場合は +1 になります。理想的には、最大ポイントを持つ N 台の車両を取得することですが、そうでない場合でも何かを取得するという考えです。

4

1 に答える 1

2

私のテーブルには現在約5k行しかなく、ゆっくりと成長しているため、実際に次の簡単なアプローチを使用することにしました(質問を書いた直後に思いつきました)。

シードは、Honda Accord (model_id 456)、2004、ガソリン、2.0L、155hp、auto-inc ID 123 のセダンです。

SELECT vehicles.*,  
    (IF(`fuel_type`='gasoline', 3, 0) + 
     IF(`body_style`='sedan', 1, 0) + 
     IF(`year` > 2001 AND `year` < 2007, 2, 0) + 
     IF(`engine_size` >= 1.8 AND `engine_size` <= 2.2, 1, 0) + 
     IF(`engine_power`=155, 3, IF(`engine_power`>124 AND `engine_power`<186, 1, 0))) AS `rank`
FROM vehicles
WHERE vehicle_id!=123 AND model_id=456
ORDER BY `rank` DESC
LIMIT 3

行が多すぎない限り、うまくいきます。テーブルが 50 ~ 100k になると、おそらく次のようなものに切り替える必要がありLuceneます。

于 2013-07-13T21:15:09.183 に答える