ElasticSearch 使用 searchAfter() 进行遍历查询,查到的数据总数小于 totalHits,并且每次查询的页 size 越大,遍历总数和 totalHits 的差距越小。
原因
这是由于如下的机制:
每个文档具有一个唯一值的字段应该用作排序规范的仲裁器。否则,具有相同排序值的文档的排序顺序将是未定义的。
如果使用的排序字段并不是唯一的,其生成的 sort 值是相同的,当指定的查询页 size 比较小或者查询数据量大时,使用有重复sort值的数据进行searchAfter(),会丢失部分sort值重复数据。这个问题只会产生在查询边界处,所以 size 越大,丢失的数据越小。
解决方案
更换唯一字段进行排序。如果必须使用非唯一字段进行排序,增加另一个唯一字段同时进行排序。