0

(我将 Solr 和 SQL 作为标签附加,因为我不知道在这种情况下使用什么。甚至可能是其他东西)

例子:

必须根据时间价格对任务进行排序的Web应用程序。用户有一个滑块来决定什么更重要(时间或价格)。

它必须进行加权排序,其中结果的分数取决于价格时间,但是当用户滑向时间或价格时,必须可以更改系数。

示例 2:

用户正在尝试找到合适的袜子。想知道它们应该有多绿和多长时间。这两个属性之间再次有一个滑块。如果在滑块的 50% 处,用户关心它们的绿色程度与它们的长度一样多。如果滑块更接近绿色端,则用户对袜子的绿色程度更感兴趣,但也希望袜子长一些。

我不知道要使用什么软件或如何实现这一点。

4

2 回答 2

0

MS SQL SERVER 回答...

DECLARE
  @min_time    DATETIME,
  @max_time    DATETIME,
  @min_price   MONEY,
  @max_price   MONEY
SELECT
  @min_time    = MIN(timestamp),
  @max_time    = MAX(timestamp),
  @min_price   = MIN(price),
  @max_price   = MAX(price)
FROM
  yourTable

SELECT
  *
FROM
  yourTable
ORDER BY
  (CAST(DATEDIFF(second, @min_time, timestamp) AS FLOAT) / CAST(DATEDIFF(second, @min_time, @max_time) AS FLOAT)) * @slider
  +
  (CAST(price - @min_price AS FLOAT) / CAST(@max_price - @min_price AS FLOAT)) * (1 - @slider)

-- Where te slider value is anything between 0 and 1

为了使您的情绪发挥作用,我对 Time 和 Price 进行相同的计算 - 我将它们转换为从 0 到 1 的值(我称之为positional weight)。
- 0.0 = 等于该字段的最小值
- 0.5 = 恰好介于该字段的最小值和最大值之间
- 1.0 = 等于该字段的最大值

然后我将位置权重乘以滑块的值(或 1 值),并将两个结果相加。

当滑块为0或1时,很简单;一个位置权重乘以一,一个位置权重乘以零。换句话说,一个位置权重不变,一个位置权重被忽略。

当滑块为 0.5 时,每个位置权重的一半相加。


在 99.999% 的值非常接近并且存在一个极端异常值的情况下,这可能会导致该字段异常占优势,或者相反。(大多数位置权重非常接近 0 或 1)

因此,一种选择是将位置权重仅基于数据顺序。因此,在许多值接近但有一个极端异常值的情况下;列表中间的值仍然是 0.5,因为它是位置权重。简而言之 - 它在序列中的位置很重要,而不是它的实际价值。

DECLARE
  @count       FLOAT
SELECT
  @count       = CAST(COUNT(*) AS FLOAT)
FROM
  yourTable

WITH
  ordered_data
AS
(
SELECT
  ROW_NUMBER() OVER (ORDER BY timestamp) AS time_id,
  ROW_NUMBER() OVER (ORDER BY price)     AS price_id,
  *
FROM
  yourData
)
SELECT
  *
FROM
  ordered_data
ORDER BY
  (CAST(time_id AS FLOAT) / @count) * @slider
  +
  (CAST(price_id AS FLOAT) / @count) * (1 - @slider)


哪个是最好的,为什么等等,开始得到统计,并且完全取决于你想要达到的目标。也许您可以取两个不同位置权重的平均值,然后使用它们?希望这能给你一些可以使用的东西。


两个答案都强制positional weight是一个百分比。这是因为 TIME 和 PRICE 可以有截然不同的尺度。将它们设置为百分比(0 到 1)会强制它们具有相同的比例。您可能需要考虑其他机制来选择合适的尺度,并且这些机制可能因每个领域而异。

每个答案都计算出相对于固定点的位置权重:列表中的最低项目。您可能希望选择其他参考点,例如 MEAN、MODE 或 MEDIAN。这样做时,您将拥有一系列 (-x 到 +y) 的位置权重,其中 x 和 y 可能是非常不同的值。然后,您可以选择将这些重新加权为(-1 到 +1)。这将需要沿曲线缩放它们,并且您需要决定如何确定该曲线。

每个答案计算出与固定参考点的“距离”为 0 到 1,或在上一段中为 -1 到 +1。这假设 TIME 和 PRICE 始终同等重要。但是,如果您只选择了位置权重应该始终接近 1 的昂贵物品怎么办?您需要一种机制来针对“所有可能的值”而不是“所有当前值”进行扩展。

你在这里有很多选择,什么选择是对还是错取决于你提出的功能需求。我不相信有一个普遍的真理可以找到。也许您需要创建一些示例并计算出您想要发生的事情,然后计算出如何?

于 2011-10-05T22:31:03.960 回答
0

在 Solr 中,您可以进行如下查询:

time:[t]^[wt] price:[p]^[wp]

其中[t]=请求的时间,[p]=请求的价格,[wt]和[wp]是权重;较高的权重赋予它所应用的术语更多的重要性。

这将对精确匹配进行加权,但您也可以使用 FunctionQuery 计算请求值和精确值之间差异的连续函数;

有关详细信息,请参阅http://wiki.apache.org/solr/FunctionQuery

于 2011-10-05T23:05:25.297 回答