Solr - 如何按地理空间距离排序并返回距离?

Posted

技术标签:

【中文标题】Solr - 如何按地理空间距离排序并返回距离?【英文标题】:Solr - How do I sort by geospatial distance and return the distance? 【发布时间】:2013-10-08 14:21:37 【问题描述】:

仅使用位置进行 Bbox 搜索会返回准确的数据;但是如果我们添加更多的搜索参数,返回的距离分数就会出错-

例如-

案例 1:

http://devtsg.truckertools.com/solr-4.4.0/collection1/select?wt=json&rows=1&fl=*,score&sort=score asc&q=!bbox score=distance sfield=geo pt=33.3232,-83.383 d=150

-它返回商店的正确距离-"score":0.02656421

案例 2:

但是如果我用 Bbox 添加另一个检查,它会返回错误的距离分数

http://devtsg.truckertools.com/solr-4.4.0/collection1/select?wt=json&rows=1&fl=*,score&sort=score asc&q=(!bbox score=distance sfield=geo pt=33.3232,-83.383 d=150 AND :)

-上面的返回 "score":0.7258905 是错误的。应该和上面那个一样。

案例 3:

只是为了确保,添加了对商店 id 的检查-

http://devtsg.truckertools.com/solr-4.4.0/collection1/select?wt=json&rows=1&fl=*,score&sort=score asc&q=(!bbox score=distance sfield=geo pt=33.3232,-83.383 d=150 AND id:9220)

-现在这个也返回错误的距离-"score":9.05333

我不明白这里出了什么问题。 提前致谢。

【问题讨论】:

【参考方案1】:

将查询的每个“与”部分放入 Solr 过滤器查询(“fq”参数),并留下“q”用于关键字搜索相关性。在您的字段列表('fl' 参数)中,您可以放置​​一个函数查询以返回距离:fl=*,dist:geodist()。需要其他参数,例如“pt”和“sfield”。要排序,请使用sort=geodist() asc

但是,在 v4.5 之前的 Solr 版本中,您不能将 geodist() 函数查询与空间“RPT”字段一起使用。我看到你正在使用 4.4。如果您需要在 Solr 4.2 到 4.4 中对 RPT 字段进行排序(仅当您有多个位置时才需要),那么您必须以不同的方式处理此问题,并且您的尝试很接近。我建议始终使用“q”和“fq”参数,因为您通常应该使用它们(分别是关键字和过滤器)。考虑一下我对 Solr 的查询的 echoParams 输出:

  "indent":"true",    
  "wt":"json",  
  "sort":"query(!bbox v='' filter=false score=distance) asc",
  "fl":"*,score,dist:query(!bbox v='' filter=false score=distance)",
  "sfield":"geo",
  "pt":"33.3232,-83.383",
  "d":"150",
  "q":"*:*",
  "fq":"!bbox",
  "fq":"id:9220"

是的,很丑。同样,从 Solr 4.5 开始,您不再需要这样做。

顺便说一句,您看到的行为实际上不是错误。您需要以不同的方式编写查询以获得所需的结果。

【讨论】:

以上是关于Solr - 如何按地理空间距离排序并返回距离?的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB:考虑到多个字段,我如何按距离排序?

地理空间距离计算优化

地理空间距离计算及优化(根据两个点经纬度计算距离)

地理空间距离计算及优化(依据两个点经纬度计算距离)

使用地理位置按距离排序提高性能

[算法系列]算法一 地理空间距离计算优化