我需要半随机地提取数据,即随机项,但在数据的某个子集中。并且需要多次这样做。
我的第一种方法是使用 PostgresORDER BY random()
并使用语句进行过滤WHERE
,但效果不佳。
你有什么建议吗?
我需要半随机地提取数据,即随机项,但在数据的某个子集中。并且需要多次这样做。
我的第一种方法是使用 PostgresORDER BY random()
并使用语句进行过滤WHERE
,但效果不佳。
你有什么建议吗?
我最终通过轮胎(Ruby gem)使用了 Elasticsearch。具有正确索引的性能使页面加载时间从 30 多秒变为 <1 秒(并且与数据库大小无关)。
例子:
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%。