Pagination 无顺序唯一ID(如位置)搜索结果的基于光标的分页

Pagination 无顺序唯一ID(如位置)搜索结果的基于光标的分页,pagination,Pagination,我正在尝试为用户可以按位置(lat、lng)搜索和排序的数据实现基于光标的分页。一个简化的例子是一个名为“searchable”的实体。它将有其唯一的主键“id”字段和位置字段“lat”、“lng” 在我按与特定点的距离进行排序后,“id”将混乱不堪。似乎没有唯一的顺序id用作光标。我也不能使用“lat”和“lng”,因为搜索和排序是按半径/距离进行的,这意味着“lat”和“lng”也没有排序 这是否意味着基于光标的分页不适合此类查询?或者有什么方法可以实现这种情况下的游标 我认为即使在这种情况

我正在尝试为用户可以按位置(lat、lng)搜索和排序的数据实现基于光标的分页。一个简化的例子是一个名为“searchable”的实体。它将有其唯一的主键“id”字段和位置字段“lat”、“lng”

在我按与特定点的距离进行排序后,“id”将混乱不堪。似乎没有唯一的顺序id用作光标。我也不能使用“lat”和“lng”,因为搜索和排序是按半径/距离进行的,这意味着“lat”和“lng”也没有排序


这是否意味着基于光标的分页不适合此类查询?或者有什么方法可以实现这种情况下的游标

我认为即使在这种情况下也可以实现基于光标的分页

首先,你说你的结果是按距离某一点的距离排序的。我假设它是一个距离某个用户可以指定的起点的距离(比如要求地图应用程序“显示我附近的餐馆”)。在这种情况下,游标值不是静态的,不能存储在可搜索记录中。它必须根据用户输入进行计算。通过动态计算光标,您失去了光标分页的优点之一[1]——具有较大结果集的良好有效性。这是因为您不能简单地使用数据库索引跳过游标值“低于”指定值的记录

[1] 有关光标分页的优缺点的更多信息,请参阅Slack engineers的这篇文章:

其次,距离本身可能不足以进行明确的排序,因为两个不同的可搜索项与起点的距离可能相同。要解决这个问题,您可以添加ID作为二级排序字段,这将使顺序具有确定性(或数学术语)

距离和ID一起形成一个可以用作光标的值

例如,假设当前页面上的最后一个结果的距离为123.45公里(或您使用的任何单位),ID为98765

这将转换为以下光标:

{
    distance: 123.45,
    id: 98765
}
当您想“转到下一页”时,只需在使用此光标搜索后请求10个(或您的页面大小)可搜索内容

如果您熟悉SQL,它将转换为如下查询:

选择s*
从可搜索的
其中get_距离(表示_点,s)>123.45
或获取距离(表示点s)=123.45,s.id>98765
限制10
其中
get_distance(a,b)
函数计算点
a
b
之间的距离

实际上,如果距离和ID都可以限定在某个范围内,您可以使用巧妙的技巧将光标编码为单个字符串,其字典顺序将与结果顺序相对应-例如“0000000 123.4500-00000 98765”

通过这种方式,SQL查询可以简化为:

选择s*
从可搜索的
其中get_光标(get_距离(表示_点,s),s.id)>'0000000123.4500-0000098765'
限制10
其中
get\u cursor(distance,id)
函数将距离和id格式化为建议格式的字符串