根据geo和int的功能进行智能排序

时间:2013-05-18 17:12:44

标签: algorithm sorting

我正在考虑解决以下任务的方法。

我们正在开发一个有一些对象的服务(网站)。每个对象都有地理字段(lat和long)。这是大约200-300个城市,可以连接对象。对象的数量是数千和数万。

此外,每个对象都有创建日期。

我们需要通过距离和新鲜度的功能来搜索对象。

E.g。我们有两个关闭的城市A和B.来自城市A的用户授权他应该看到来自城市A的对象,然后在下一页上看到来自城市B的对象(因为来自A的对象更近)。 但是,如果有一个像A一年前添加的对象,以及今天添加的B对象,那么B的对象应该显示为A的一个。

因此,对于来自城市A的peoeple,我们可以创建具有相关索引的特殊字段,例如= 100 *距离+ age_in_days 然后按此字段排序,我们将根据需要获取数据。

问题是这样的相关索引不适用于其他地方的所有其他人。

在我的例子中,我使用了线性函数,但它只是一个例子,我们需要适合正确的函数。

该网站将在我们的服务器上运行,因此我们几乎可以使用任何数据库或任何其他软件(我应该使用mongodb)

2 个答案:

答案 0 :(得分:0)

我有以下想法

  1. 每天回收相关索引,并将其与

    之类的对象保持一致
    {
        fields : ...,
        relindex : {
            cityA : 100,
            cityB : 120
        }
    }
    

    如果用户属于cityA,则按 relindex.cityA

  2. 排序

    缺点:

    • 所有对象的重复更新,但我不认为这是一个人的问题
    • 巨大的蒙哥指数。如果我们有大约300个城市,那么每个对象将有300个索引字段
    • 很难添加新城市。

    1. 使用3d空间索引:(纬度,长度,新鲜度)。但我不知道是否有任何数据库支持3d geo-patial

      1. 在群集中压缩关闭对象,仅在群集中搜索,但不能在整个群集中搜索。但我不确定它没关系。

答案 1 :(得分:0)

我认为有四种可能的解决方案:

1)使用3D索引 - lat,lon,time。

2)距离更重要 - 使用一些地理索引并选择最近的对象。如果对象太旧,则丢弃它并增加允许的距离。有足够的物体后停止。

3)时间更重要 - 按时间索引并丢弃太远的对象。

4)近似距离 - 选择一些重要的点(城市中心或物体群的中心)并预先计算这些重要点的距离。查询将首先找到最近的重要点,然后使用索引查找数据。 或者,您可以从对象创建群集,然后计算查询中的距离。这里的要点是集群数量有限。