为什么在分页时可能从 Azure 搜索中得到重复的结果?

Why is it possible to get duplicate results from Azure Search when paging?

有时使用 Azure Search's paging 时,结果中可能会出现重复的文档。这是寻呼请求的示例:

GET /indexes/myindex/docs?search=*$top=15&$skip=15&$orderby=rating desc

为什么这可能?怎么会发生?分页时是否有一致性保证?

如果基础索引发生变化,或者如果您依赖于按相关性得分排序,则不能保证分页查询的结果稳定。分页只是为每个页面更改 $skip 的值,但每个查询都是独立的并在数据的当前视图上运行(即 – 没有快照或其他一致性机制,就像您在通用中找到的那样)数据库)。

这里是您如何获得重复项的示例。假设一个索引包含四个文档:

  1. { "id": "1", "rating": 5 }
  2. { "id": "2", "rating": 3 }
  3. { "id": "3", "rating": 2 }
  4. { "id": "4", "rating": 1 }

现在假设您要翻阅结果,页面大小为 2,按评级排序。您将执行此查询以获取第一页:

$top=2&$skip=0&$orderby=rating desc

并得到这些结果:

  1. { "id": "1", "rating": 5 }
  2. { "id": "2", "rating": 3 }

现在您将第五个文档插入索引:

{ "id": "5", "rating": 4 }

此后不久,您执行查询以获取结果的第二页:

$top=2&$skip=2&$orderby=rating desc

并得到这些结果:

  1. { "id": "2", "rating": 3 }
  2. { "id": "3", "rating": 2 }

请注意,您已提取文档 2 两次。这是因为新文档5的评分值比较大,所以排在文档2之前,排在第一页。

在您依赖文档评分的情况下(您不使用 $orderby 或使用 $orderby=search.score()),分页可以 return 重复结果,因为每个查询可能由不同的副本处理,并且该副本可能具有不同的术语和文档频率统计信息——足以更改页面边界处文档的相对顺序。

出于这些原因,将 Azure 搜索视为搜索引擎(因为它是)而不是通用数据库很重要。