【问题标题】:How to iterate over a SOLR shard which has over 100 million documents?如何迭代拥有超过 1 亿个文档的 SOLR 分片?
【发布时间】:2012-12-14 12:14:22
【问题描述】:

我想遍历所有这些文档,而不必将整个结果加载到内存中,这显然是这种情况 - QueryResponse.getResults() 返回 SolrDocumentList,它是一个 ArrayList。

在文档中找不到任何内容。我正在使用 SOLR 4。

关于问题背景的说明:我需要在将新的 SOLR 分片添加到现有分片集群时执行此操作。在这种情况下,我想基于一致哈希将一些文档从现有分片移动到新添加的分片。我们的数据不断增长,我们需要不断引入新的分片。

【问题讨论】:

  • 在索引字段上使用范围查询是实现此目的的好方法吗?即使特定字段不是唯一的?

标签: search solr lucene


【解决方案1】:

您可以设置“行”和“开始”查询参数来对结果集进行分页。首先查询 start = 0,然后 start = rows,start = 2*rows 等,直到到达完整结果集的末尾。

http://wiki.apache.org/solr/CommonQueryParameters#start

【讨论】:

  • 是的,这就是我广泛做的事情。最重要的是,我正在对索引字段进行查询和排序。不使用“开始”,因为这会减慢对大结果集的获取速度。我想知道 SOLR 是否提供了数据库中存在的类似游标的功能。
  • 不,我不这么认为。您可以根据进度的起始值对命中做一些事情。由于您正在对某个值进行排序,因此您可以使用范围查询来仅获取出现在某个排序标识符字段之后的记录,因此在对结果进行分页时始终从 start=0 检索。
【解决方案2】:

我正在测试一个可能的解决方案: Solr paging 100 Million Document result set

已粘贴: 我正在尝试使用一个单独的索引字段(整数)对非常大的结果集(例如,超过 1 亿个文档)进行深度分页,我在其中插入一个随机变量(介于 0 和一些已知的 MAXINT 之间)。查询大型结果集时,我执行初始字段查询,不返回任何行,然后根据计数,我将范围划分为 0 到 MAXINT,以便通过在子范围内再次执行查询来获得平均 PAGE_COUNT 结果随机变量并抓取该范围内的所有行。显然,实际的行数会有所不同,但应该遵循可预测的分布。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 2022-12-03
    • 1970-01-01
    • 2013-08-26
    • 2015-08-19
    相关资源
    最近更新 更多