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


请注意,此属性并不旨在帮助您实现搜索结果的分页。您可以使用“顶部”和“跳过”搜索参数来实现分页。
来源


为什么不能将其用于分页?我遇到一种情况,我想运行查询,然后逐页浏览结果的静态副本。我不希望这些查询结果在我的脚下改变,因为当我浏览它们时,新文档已添加到基础数据库中。以我为例,在提交初始查询和导航到另一页之间的一两分钟内,可能会添加成百上千个结果。我该怎么办?

#1 楼

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


为什么不建议使用ContinuationToken来实现分页?
如何实现分页以使结果从页面保持完全稳定

这些实际上是不相关的问题,因为有关ContinuationToken的任何内容都不能保证搜索结果的稳定性。无论您使用$top$skip还是ContinuationToken,Azure搜索都无法保证分页的一致性。对于问题#1,不建议使用ContinuationToken进行分页的原因是Azure搜索控制何时返回令牌,不是您的应用程序代码。如果您对Azure搜索决定如何以及何时决定向您返回令牌的假设,则将来的服务更新可能会破坏这些假设。 ContinuationToken的目的是防止对太多文档的请求使服务不堪重负,因此您应该假定是否返回令牌完全由服务自行决定。

对于问题2,因为Azure搜索不提供一致性保证,您不能完全避免出现相同的文档显示在多个页面中,丢失的文档或在结果中看到它们时将其删除的问题。即使您想要构建自己的结果快照并在应用程序代码中对其进行分页,一开始也无法构建一致的快照。但是,如果您唯一的担心是避免在结果中显示新文档,则可以在索引中包括一个创建的时间戳字段,并在每个搜索请求中对此字段进行过滤。

坦白说,除非您试图导出索引的全部内容,否则我会问是否需要围绕分页提供如此强大的一致性保证。 Google和Bing均不提供此类保证,因此可以说已经为此设定了用户期望。如果您要导出数据,不幸的是,今天使用Azure搜索并不容易。在这种情况下,请对该用户语音项目进行投票,以帮助团队确定此方案的优先级。