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

时间:2013-10-08 14:21:38

标签: solr lucene geospatial

仅使用位置进行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}

-it返回商店的正确距离 - “得分”: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 :)

- 上面的一个返回“得分”: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)

- 现在这个也返回了错误的距离 - “得分”:9.05333

这里没有出错。 提前谢谢。

1 个答案:

答案 0 :(得分:1)

将查询的每个“与”部分放入Solr过滤器查询('fq'param),并将“q”保留为关键字搜索相关性。在您的字段列表('fl'param)中,您可以放置​​一个函数查询来返回距离: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开始,您不再需要诉诸于此。

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