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 行并且它们正在缓慢增长,我决定实际使用以下简单方法(它是在我写完问题后才想到的)。

种子可以说是本田雅阁(model_id 456),2004 年,汽油,2.0 升,155 马力,轿车 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 回答