从Whoosh索引中有效地获取n个随机文档

时间:2016-02-10 17:52:45

标签: python whoosh

如果索引量很大Whoosh,我怎样才能有效地从中检索n个随机文档?

只需将所有文档拉入内存并使用random.sample ...

,我就可以非常低效地执行此操作
random.sample(list(some_index.searcher().documents()), n)

但如果索引包含大量文档,那么这将是非常低效的(在内存使用和磁盘IO方面)。

2 个答案:

答案 0 :(得分:0)

只需创建一个新的数字字段ID,该字段应该是唯一的,最好是自动递增。飞快移动没有自动增加,你应该自己动手。

然后要获取随机列表,只需使用random.randint(1, MAX_ID)生成随机整数列表,然后构建搜索查询"ID:2 or ID:16 or ID:43 or ..."并使用它进行查询,您将获得所需的列表。

您可以在不知道最大限制或最小限制的情况下查询间隔。例如:

  • ID:[ 10 to ]
  • ID:[ to 10]
  • ID:[ 1 to 10]
  • ID:2
  • ID:2 | ID:3

答案 1 :(得分:0)

可能有更好的方法,但在类似情况下对我有用的是在索引时为每个文档分配一个随机数。每个文档都会获得一个名为rand_id的字段,其中包含一个随机数。然后,您可以在搜索时生成另一个随机数x并搜索rand_id > x。然后,您可以将搜索范围限制为n个项目。如果搜索没有产生足够的结果,请再次搜索rand_id < x并完成剩下的工作。