0

所以我有一个我认为是一个非常独特的问题。我需要计算一个非常大的项目表(200,000ish)的排名。他们的“排名”基于几个加在一起的加权属性。1-4 级的 7 个属性(基于它们的四分位数 1 底部四分位数 4 顶部),每个属性最初均等加权,然后加在一起(7-28 级)。我希望允许用户调整属性的权重,使它们中的任何一个或所有属性的重要性增加一倍或一半。这可能会改变他们的最终排名。我正在寻找是否有人处理过类似的问题或对从哪里开始有任何想法。谢谢!

4

2 回答 2

0

作为基本设计,我会尝试使您的原始项目以及它们的默认排名不可变。

然后,您在 cron 上运行一个脚本,以计算它们在间隔上的排名。这将通过您选择的某些算法来完成,但仅作为示例:

假设一个项目具有以下属性 {"someRetailListing":{ "id": "1", "price": "100000.12", "city": "New York City", "rooms": "4", .. . "rankCity": 4, "rankPrice": 3, "rankQuality": 3 } 你的脚本第一次运行时,它的总排名是 20/30

现在,一个用户出现了,并添加了他的输入,然后你将他的提交保存在一个单独的桶中(或在同一个桶中使用一个类型): { "type":"userRank" "uid": 3121, "propertyID": 1 "rankCity": 3, "rankPrice": 1, "rankQuality": 3 } 当您的脚本运行时,也许您希望 50% 的排名来自用户,50% 来自默认值。所以你可以把所有的用户结果加在一起,得到平均用户分数,然后与你的合并,然后做任何你想做的事。

你保存这个最终结果 { "type": "userPropertyRank", "propertyID": 1 "rankCity": 3, "rankPrice": 3, "rankQuality": 3 }

于 2015-07-08T19:22:52.600 回答
0

排名的基本结构是带有变量的排序查询。您只需要将用户输入纳入排名。

查询看起来像这样:

select t.*, (@rn := @rn + 1) as ranking
from (select t.*, (@v1 * col1 + @v2 * col2 . . .) as ranking
      from table t
     ) t cross join
     (select @rn := 0) params
order by ranking;

您可以轻松地在数据库中执行此操作;你只需要传入正确的变量。

于 2015-07-08T19:25:32.320 回答