0

データを半ランダムに抽出する必要があります。これはランダムなアイテムですが、データの特定のサブセット内にあります。そして、これを数回行う必要があります。

私の最初のアプローチは、Postgres を使用ORDER BY random()し、ステートメントでフィルター処理するWHEREことですが、パフォーマンスが低下します。

何か提案はありますか?

4

2 に答える 2

0

結局、Tire (Ruby gem) を通じて Elasticsearch を使用することになりました。適切なインデックス作成によるパフォーマンスにより、ページの読み込み時間が 30 秒以上から 1 秒未満になりました (DB サイズとは無関係です)。

例:

Recipe.search do |search|
    search.sort do |sort|
      sort.by({
        _script: { 
          script: "Math.random()",
          type: "number",
          params: {},
          order: "asc"
        }
      })
    end

    search.size 1
end

生成するもの:

{
"sort": [{
    "_script": {
        "script": "Math.random()",
        "type": "number",
        "params": {},
        "order": "asc"
    }
}],
"size": 1
}
于 2013-10-01T22:03:45.057 に答える
0

次のようなものを使用すると回避order by random()できます。

select * from table where [your conditions] and random()>.9

これにより、他のすべての条件に一致する行の約 90% が選択されます。ただし、これでパフォーマンスが向上するかどうかはわかりません。

別の戦略:

  1. 1 から 1000 までの乱数を含む列をデータに追加します (例: randc という名前を使用)。
  2. この列にインデックスを作成
  3. 次のようなものを使用しますselect * from table where [your conditions] and randc > 900

数字はランダムであるため、条件に一致する行から約 90% が選択される可能性が高くなります。

于 2013-10-01T10:48:55.930 に答える