データを半ランダムに抽出する必要があります。これはランダムなアイテムですが、データの特定のサブセット内にあります。そして、これを数回行う必要があります。
私の最初のアプローチは、Postgres を使用ORDER BY random()
し、ステートメントでフィルター処理するWHERE
ことですが、パフォーマンスが低下します。
何か提案はありますか?
データを半ランダムに抽出する必要があります。これはランダムなアイテムですが、データの特定のサブセット内にあります。そして、これを数回行う必要があります。
私の最初のアプローチは、Postgres を使用ORDER BY random()
し、ステートメントでフィルター処理するWHERE
ことですが、パフォーマンスが低下します。
何か提案はありますか?
結局、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
}
次のようなものを使用すると回避order by random()
できます。
select * from table where [your conditions] and random()>.9
これにより、他のすべての条件に一致する行の約 90% が選択されます。ただし、これでパフォーマンスが向上するかどうかはわかりません。
別の戦略:
select * from table where [your conditions] and randc > 900
数字はランダムであるため、条件に一致する行から約 90% が選択される可能性が高くなります。