阅读 Azure Search .NET SDK 的文档,我发现 ContinuationToken 属性不应该用于分页(这与@odata.nextLink
and @search.nextPageParameter
REST API 中的属性)。
请注意,此属性并不旨在帮助您实现搜索结果分页。您可以使用“顶部”和“跳过”搜索参数来实现分页。Source https://learn.microsoft.com/dotnet/api/microsoft.azure.search.models.documentsearchresultbase-2.continuationtoken?view=azure-dotnet
为什么我不能用它来分页?我遇到一种情况,我想运行查询,然后逐页逐步浏览结果的静态副本。然而,当我浏览它们时,随着新文档添加到底层数据库中,我不希望这些查询结果在我脚下发生变化。就我而言,在提交初始查询和导航到另一个页面之间的一两分钟内可能会添加数百或数千个结果。我怎样才能做到这一点?
您的问题可以分两部分来解答:
- 为什么不建议使用
ContinuationToken
实现分页?
- 如何实现分页以使页面之间的结果保持完全稳定?
这些实际上是不相关的问题,因为没有关于ContinuationToken
保证了搜索结果的稳定性。 Azure 搜索不保证分页的一致性,无论您是否使用$top
and $skip
or ContinuationToken
.
对于问题#1,原因ContinuationToken
不建议进行分页的原因是 Azure 搜索控制何时返回令牌,而不是您的应用程序代码。如果你对 Azure 搜索决定如何以及何时返回令牌做出假设,那么这些假设可能会随着未来的服务更新而被打破。的意图ContinuationToken
是为了防止请求太多文档而导致服务不堪重负,因此您应该假设服务是否会返回令牌完全取决于服务。
对于问题 2,由于 Azure 搜索不提供一致性保证,因此您无法完全避免诸如同一文档出现在多个页面中、文档丢失或在结果中看到文档时已被删除等问题。即使您想构建自己的结果快照并在应用程序代码中对它们进行分页,构建一致的快照一开始也是不可能的。但是,如果您唯一关心的是避免在结果中显示新文档,则可以在索引中包含创建的时间戳字段,并在每个搜索请求中对其进行过滤。
坦率地说,除非您尝试导出索引的全部内容,否则我会质疑分页是否需要如此强大的一致性保证。谷歌和必应没有做出这样的保证,因此可以说用户的期望已经围绕这一点设定了。如果您想导出数据,不幸的是,现在的 Azure 搜索并不容易做到这一点。在这种情况下,请对此进行投票用户声音 https://feedback.azure.com/forums/263029-azure-search/suggestions/8631079-export-import-search-indexes帮助团队优先考虑此场景的项目。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)