为什么ContinitionToken不能用于Azure Search API中的分页?

问题描述 投票:3回答:1

阅读Azure Search .NET SDK的文档,我发现ContinuationToken属性不应该用于分页(这与REST API中的@odata.nextLink@search.nextPageParameter属性相同)。

请注意,此属性不是为了帮助您实现搜索结果的分页。您可以使用Top和Skip搜索参数实现分页。 Source

为什么我不能用它来分页?我有一种情况,我想运行一个查询,然后逐页逐步浏览结果的静态副本。我不希望这些查询结果在我的脚下发生变化,因为我正在浏览它们,因为新文档被添加到底层数据库中。在我的情况下,可能会有数百或数千个结果在提交初始查询和导航到另一个页面之间的一两分钟内添加。我怎么能做到这一点?

azure azure-search
1个回答
3
投票

您的问题可以分为两部分:

  1. 为什么不建议使用ContinuationToken来实现分页?
  2. 如何实现分页以使结果在页面之间保持完全稳定?

这些实际上是无关的问题,因为没有任何关于ContinuationToken保证搜索结果的稳定性。无论您使用$top还是$skipContinuationToken,Azure Search都不会对分页进行一致性保证。

对于问题#1,不建议将ContinuationToken用于分页的原因是Azure Search控制何时返回令牌,而不是应用程序代码。如果您假设Azure Search决定如何以及何时返回令牌,那么这些假设可能会因未来的服务更新而中断。 ContinuationToken的目的是防止请求太多文档压倒服务,因此您应该假设它完全由服务自行决定是否返回令牌。

对于问题#2,由于Azure搜索不提供一致性保证,因此您无法完全避免出现在多个页面中显示的同一文档,缺少文档或在结果中显示时删除的文档等问题。即使您想在应用程序代码中构建自己的结果快照并在其上进行分页,也不可能首先构建一致的快照。但是,如果您唯一关心的是避免在结果中显示新文档,则可以在索引中包含已创建的时间戳字段,并在每个搜索请求中对其进行过滤。

坦率地说,除非你试图导出索引的全部内容,否则我会怀疑是否需要在分页时提供如此强大的一致性保证。 Google和Bing没有做出这样的保证,所以可以说用户的期望已经围绕着这个。如果您尝试导出数据,那么现在使用Azure搜索并不容易。在这种情况下,请对此User Voice项目进行投票,以帮助团队确定此方案的优先顺序。

© www.soinside.com 2019 - 2024. All rights reserved.