【发布时间】:2018-12-06 15:02:26
【问题描述】:
我正在检查我的数据库中的所有记录是否都存在于 Azure 搜索中(大约 610k)。但是 $skip 参数有 100000 个限制。有没有办法绕过这个限制?
【问题讨论】:
标签: azure azure-cognitive-search
我正在检查我的数据库中的所有记录是否都存在于 Azure 搜索中(大约 610k)。但是 $skip 参数有 100000 个限制。有没有办法绕过这个限制?
【问题讨论】:
标签: azure azure-cognitive-search
您不能分面超过 100K 文档,但是,您可以添加分面来解决此问题。例如,假设您有一个名为 Country 的构面,并且没有一个构面包含超过 100K 的文档。您可以对 Country == ‘Canada’ 的所有文档进行切面,然后对 Country == ‘USA’ 的所有文档进行切面……
【讨论】:
只是为了澄清其他答案:您不能直接绕过限制,但可以使用解决方法。
您可以这样做:
1) 向索引添加一个唯一字段。内容可以是修改时间戳(如果它足够细化以使其唯一)或例如一个流水号。或者,您可以为此使用一些现有的唯一字段。
2) 从您的唯一字段排序的索引中获取前 100000 个结果
3) 检查您的唯一字段结果中的最大值(如果按升序排序) - 所以最后一个条目的值
4) 通过基于相同的唯一字段排序并添加一个过滤器来获取接下来的 100000 个结果,该过滤器仅在唯一字段的值大于前一个最大值的情况下获取结果。这样不会返回相同的前 100000 个值,但我们会得到接下来的 100000 个值。
5) 继续,直到获得所有结果
缺点是你不能对结果使用其他自定义排序,除非你在得到结果后进行排序。
【讨论】:
我使用数据metadata_storage_last_modified作为过滤器,下面是我的例子。
offset skip time
0 --%--> 0
100,000 --%--> 100,000 getLastTime
101,000 --%--> 0 useLastTime
200,000 --%--> 99,000 useLastTime
201,000 --%--> 100,000 useLastTime & getLastTime
202,000 --%--> 0 useLastTime
因为Skip限制是100k,所以我们可以计算skip
AzureSearchSkipLimit = 100k
AzureSearchTopLimit = 1k
skip = offset % (AzureSearchSkipLimit + AzureSearchTopLimit)
如果总搜索计数大于 AzureSearchSkipLimit,则应用
orderby = "metadata_storage_last_modified desc"
当跳过到达 AzureSearchSkipLimit 时,从数据末尾获取 metadata_storage_last_modified 时间。并将 metadata_storage_last_modified 作为下一个 100k 搜索过滤器。
filter = metadata_storage_last_modified lt ${metadata_storage_last_modified}
【讨论】: