0

(このような状況で何を使用すればよいかわからないため、SolrとSQLの両方をタグとして添付しています。おそらく他の何かでも)

例:

時間価格に基づいてタスクをソートする必要があるWebアプリケーション。ユーザーには、何がより重要か(時間または価格)を決定するスライダーがあります。

結果のスコアが価格時間に依存する加重ソートを実行する必要がありますが、ユーザーが時間またはそれぞれ価格に向かってスライドするときに係数を変更できる必要があります。

例2:

ユーザーは適切な靴下を見つけようとしています。どれだけ環境に優しいのか、どれくらいの長さなのか疑問に思います。ここでも、これら2つのプロパティの間にスライダーがあります。スライダーが50%の場合、ユーザーは長さと同じくらい緑が気になります。スライダーがグリーンエンドに近い場合、ユーザーは靴下がどれだけグリーンであるかに関心がありますが、同様に長くしたいと考えています。

使用するソフトウェアやこれを実現する方法がわかりません。

4

2 に答える 2

0

MSSQLSERVERの回答...

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

あなたの感情を機能させるために、私は時間と価格の両方に対して同じ計算を行います-私はそれらを0から1までの値に変換します(これを私はそれと呼びますpositional weight)。
-0.0=そのフィールドの最小値に等しい-0.5=そのフィールドの最小値
と最大値の中間のExaclty
-1.0=そのフィールドの最大値に等しい

次に、位置の重みにスライダーの値(または1つの値)を掛けて、2つの結果を合計します。

スライダーが0または1の場合、それは簡単です。1つの位置の重みは1で乗算され、1つの位置の重みは0で乗算されます。つまり、1つの位置の重みは変更されず、1つの位置の重みは無視されます。

スライダーが0.5のとき、各位置の重みの半分が合計されます。


値の99.999%が近接していて、極端な外れ値が1つある場合、これにより、そのフィールドが異常に優勢になるか、またはその逆になる可能性があります。(ほとんどの位置の重みは0または1に非常に近いです)

そのため、1つのオプションは、データの順序のみに基づいて位置の重みを設定することです。したがって、多くの値が近いが、極端な外れ値が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)


どちらが最適か、理由などは統計的になり始め、正確に何を達成しようとしているかによって異なります。たぶん、2つの異なる位置の重みの平均を取り、それらを使用することができますか?うまくいけば、これはあなたに仕事をする何かを与えるでしょう。


どちらの回答positional weightも、をパーセンテージに強制します。これは、TIMEとPRICEのスケールが大きく異なる可能性があるためです。それらをパーカンテージ(0から1)にすると、それらは同じスケールになります。適切なスケールを選択するための代替メカニズムを検討することをお勧めします。これらはフィールドごとに異なる場合があります。

各回答は、リストの一番下の項目である固定小数点に対する位置の重みを計算します。MEAN、MODE、MEDIANなどの他の参照ポイントを選択することもできます。そうすることで、(-xから+ y)の位置の重みの範囲が得られ、xとyは潜在的に非常に異なる値になります。次に、これらを(-1から+1)に再重み付けすることを選択できます。これには、曲線に沿ってそれらをスケーリングする必要があり、その曲線を決定する方法を決定する必要があります。

各回答は、固定参照点からの「距離」を0から1、または前の段落の-1から+1として計算します。これは、時間と価格の両方が常に等しく重要であることを前提としています。しかし、位置の重みが常に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 に答える