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 - 如何按地理空间距离排序并返回距离?的主要内容,如果未能解决你的问题,请参考以下文章