有时在使用时Azure 搜索的分页 https://learn.microsoft.com/en-us/azure/search/search-pagination-page-layout结果中可能存在重复的文档。下面是一个分页请求的示例:
GET /indexes/myindex/docs?search=*$top=15&$skip=15&$orderby=rating desc
为什么这可能?怎么会发生呢?分页时是否有一致性保证?
如果基础索引发生变化,或者您依赖于按相关性分数排序,则无法保证分页查询的结果稳定。分页只是改变了值$skip
对于每个页面,但每个查询都是独立的,并且对数据的当前视图进行操作(即,没有像通用数据库中那样的快照或其他一致性机制)。
以下是如何获取重复项的示例。假设一个索引有四个文档:
{ "id": "1", "rating": 5 }
{ "id": "2", "rating": 3 }
{ "id": "3", "rating": 2 }
{ "id": "4", "rating": 1 }
现在假设您想要以 2 的页面大小翻阅结果,并按评级排序。您将执行此查询来获取第一页:
$top=2&$skip=0&$orderby=rating desc
并得到这些结果:
{ "id": "1", "rating": 5 }
{ "id": "2", "rating": 3 }
现在您将第五个文档插入到索引中:
{ "id": "5", "rating": 4 }
此后不久,您执行查询来获取第二页结果:
$top=2&$skip=2&$orderby=rating desc
并得到这些结果:
{ "id": "2", "rating": 3 }
{ "id": "3", "rating": 2 }
请注意,您已获取文档 2 两次。这是因为新文档 5 的评分值更大,因此它排在文档 2 之前并位于第一页。
在您依赖文档分数的情况下(或者您不使用$orderby
或者你正在使用$orderby=search.score()
),分页可能会返回重复的结果,因为每个查询可能由不同的副本处理,并且该副本可能具有不同的术语和文档频率统计信息 - 足以更改页面边界处文档的相对顺序。
由于这些原因,将 Azure 搜索视为搜索引擎(因为它确实如此)而不是通用数据库非常重要。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)