Bru*_*ton 4 azure-cognitive-search
有时,使用Azure 搜索的分页时,结果中可能会出现重复的文档。下面是一个分页请求的示例:
GET /indexes/myindex/docs?search=*$top=15&$skip=15&$orderby=rating desc
Run Code Online (Sandbox Code Playgroud)
为什么这可能?怎么会发生呢?分页时是否有一致性保证?
如果基础索引发生变化,或者您依赖于按相关性分数排序,则无法保证分页查询的结果稳定。分页只是更改每个页面的值$skip,但每个查询都是独立的,并且对数据的当前视图进行操作(即 \xe2\x80\x93 没有快照或其他一致性机制,如您\xe2\x80\x99d 中找到的那样)通用数据库)。
以下是如何获取重复项的示例。假设一个索引有四个文档:
\n\n{ "id": "1", "rating": 5 }{ "id": "2", "rating": 3 }{ "id": "3", "rating": 2 }{ "id": "4", "rating": 1 }现在假设您想要以 2 的页面大小翻阅结果,并按评级排序。您\xe2\x80\x99d 执行此查询来获取第一页:
\n\n$top=2&$skip=0&$orderby=rating desc\nRun Code Online (Sandbox Code Playgroud)\n\n并得到这些结果:
\n\n{ "id": "1", "rating": 5 }{ "id": "2", "rating": 3 }现在您将第五个文档插入到索引中:
\n\n{ "id": "5", "rating": 4 }\nRun Code Online (Sandbox Code Playgroud)\n\n此后不久,您执行查询来获取第二页结果:
\n\n$top=2&$skip=2&$orderby=rating desc\nRun Code Online (Sandbox Code Playgroud)\n\n并得到这些结果:
\n\n{ "id": "2", "rating": 3 }{ "id": "3", "rating": 2 }请注意,您\xe2\x80\x99 已获取文档 2 两次。这是因为新文档 5 的评级值更大,因此它排在文档 2 之前并位于第一页。
\n\n在您依赖文档分数的情况下(您不使用$orderby或正在使用$orderby=search.score()),分页可能会返回重复的结果,因为每个查询可能由不同的副本处理,并且该副本可能具有不同的术语和文档频率统计——足以改变页面边界处文档的相对顺序。
出于这些原因,将 Azure 搜索视为搜索引擎(因为它确实是)而不是通用数据库非常重要。
\n| 归档时间: |
|
| 查看次数: |
1856 次 |
| 最近记录: |