问题

在 Elasticsearch 中使用 SearchAfter 进行深度分页时,SearchAfter 会排除掉排序字段值与 SearchAfter 参数值完全相同的文档。

当你获取最后一个文档的 Sort 值作为下一次查询的 SearchAfter 参数时,如果最后一个文档的排序字段值与其他文档相同,那么下一次查询就会排除掉这些排序字段值相同的文档,从而导致第二页少一个或多个记录。

解决

为了避免这个问题,在获取 lastSort 时,需要确保它是唯一的,例如 _id,以保证排序的唯一性。避免使用 created_at 这种有可能出现重复的值作为排项,而是用 id 作为排序项

1ess := es.Search().Timeout("10s").
2    Index(it.indexName).
3    Sort("created_at", false).
4    Query(boolQuery).
5    Size(int(req.Size))
1ess := es.Search().Timeout("10s").
2    Index(it.indexName).
3    Sort("_id", false). // 使用 _id 排序,确保排序的唯一性
4    Query(boolQuery).
5    Size(int(req.Size))