0

我需要半随机地提取数据,即随机项,但在数据的某个子集中。并且需要多次这样做。

我的第一种方法是使用 PostgresORDER BY random()并使用语句进行过滤WHERE,但效果不佳。

你有什么建议吗?

4

2 回答 2

0

我最终通过轮胎(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
}
于 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 回答