4

我希望能够按分数和位置对搜索结果进行排序。数据库中的每个用户都有 lat/lot,我目前正在索引:

location :coordinates do
  Sunspot::Util::Coordinates.new latlon[0], latlon[1]      
end

我将执行搜索的模型也以相同的方式编入索引。基本上我想要实现的是结果按分数排序,然后按位置排序。因此,如果我搜索 Walmart,我希望查看所有 Walmart 按其与我所在位置的地理接近程度排序的信息。

我记得读过一些关于 solr 的新地理排序的内容,但不确定它是否超出 alpha 和/或 sunspot 是否实现了包装器。

你会推荐什么?

4

1 回答 1

6

由于 Sunspot 计算位置类型的方式,您需要做一些额外的工作才能让它按与目标的距离进行排序。它的工作方式是为每个点创建一个地理哈希,然后在该地理哈希上使用常规全文搜索进行搜索。结果是您可能无法确定 10 公里外的点是否比 5 公里外的点更远,但您可以判断 50 公里外的点是否比 1-2 公里外的点更远. 确切的距离是任意的,但结果是您可能不会获得您想要的细粒度结果,并且搜索更多地充当过滤可接受接近范围内的点的一种方式。使用内置位置搜索过滤您的点后,有三种方法可以完成您想要的:

  1. 升级到 Solr 3.1 或更高版本并升级您的 schema.xml 以使用新的空间搜索列。然后,您需要对 Sunspot 进行自定义修改,以创建使用这些新数据类型的字段和排序。据我所知,这些在 Sunspot 中尚不可用,因此您必须自己建立这些连接,并且您必须在 Solr 中进行一些手动配置。
  2. 利用Spatial Solr 插件。您必须在 Solr 目录中安装一个新的 JAR,并且您必须对 Sunspot 进行一些修改,但它们相对容易,完整的说明可以在这里找到。
  3. 利用您的数据库,如果您的数据库也在位置列上被索引,那么您可以使用 Sunspot 内置位置搜索将您的结果过滤到合理大小的集合。然后,您可以查询数据库以获取这些结果,并使用您自己的距离函数按与您的位置的接近程度对它们进行排序。
于 2011-05-03T15:53:18.427 回答