0

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

我们正在开发一个有一些对象的服务(网站)。每个对象都有地理场(纬度和经度)。它可以连接大约 200-300 个城市的对象。对象的数量是数千和数万。

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

我们需要通过距离和新鲜度函数排序来搜索对象。

例如,我们有两个靠近的城市 A 和 B。来自城市 A 的用户授权,他应该看到来自城市 A 的对象,然后在接下来的一些页面中,来自城市 B(因为来自 A 的对象更接近)。但是,如果有一个来自 A 的对象是像一年前添加的,而一个来自 B 的对象是今天添加的,那么 B 的对象应该在 A 的对象之前显示。

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

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

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

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

4

2 回答 2

0

我有以下想法

  1. 每天 Recacl 相关索引并与对象保持一致

    {
        fields : ...,
        relindex : {
            cityA : 100,
            cityB : 120
        }
    }
    

    如果用户属于 cityA 则按 relindex.cityA排序

缺点:

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

  1. 使用 3d 空间索引:(纬度、经度、新鲜度)。但我不知道是否有任何数据库支持 3d 地理空间

  1. 压缩集群中的关闭对象,仅在集群中搜索,而不是在整个基础上搜索。但我不确定它是否正常。
于 2013-05-18T19:27:52.083 回答
0

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

1) 使用 3D 索引 - 纬度、经度、时间。

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

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

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

于 2013-05-18T19:37:16.140 回答