问题
在 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))