Solr 索尔距离滤波

Solr 索尔距离滤波,solr,filter,geospatial,Solr,Filter,Geospatial,我正在尝试使用Solr进行距离范围搜索 我知道在5公里范围内搜索过滤非常容易 &q=*:*&fq={!geofilt pt=45.15,-93.85 sfield=stored=5} 我想要的是,如果我在5到10公里的范围内观察,如何做同样的事情 谢谢这里有几种方法可以解决这个问题。因此,很明显,查询进入了过滤器查询(“fq”参数),因为其目的不是修改分数。让我们假设这些参数是在请求URL中设置的(尽管它们不必放在那里): 以下是一种方法: _query_:"{!geofilt d=10}" -

我正在尝试使用Solr进行距离范围搜索

我知道在5公里范围内搜索过滤非常容易
&q=*:*&fq={!geofilt pt=45.15,-93.85 sfield=stored=5}

我想要的是,如果我在5到10公里的范围内观察,如何做同样的事情


谢谢

这里有几种方法可以解决这个问题。因此,很明显,查询进入了过滤器查询(“fq”参数),因为其目的不是修改分数。让我们假设这些参数是在请求URL中设置的(尽管它们不必放在那里):

以下是一种方法:

_query_:"{!geofilt d=10}" -_query_:"{!geofilt d=5}"
我使用了query Solr语法hack来输入一个子查询,它提供了将查询解析器从Lucene解析器切换到geo解析器的机会

以下是另一种可能最快的方法:

{!frange l=5 u=10}geodist()
这是一个函数查询,返回限制在所需范围内的距离。它可能会更快,因为它会对每个文档进行一次评估,而不是像以前那样评估两次

您可能希望将其标记为,并添加一个bbox过滤器,以便检查的文档比检查的文档少得多以下是最终结果(不是url转义):

在Solr4中,如果搜索中有“大量”结果,则与RPT字段类型一起使用的“geofilt”技术应该更快。此外,如果您的空间字段是多值的,那么您将必须使用geofilt,并且您还需要创建一个自定义的聚合Spatial4j形状,其中包括一个外圆,而不包括一个内圆。这也将使geofilt方法更快,即使您没有多值数据。在不久的将来,你可以不用自己写,就可以指定一个甜甜圈的形状。
{!frange l=5 u=10}geodist()
pt=45.15,-93.85&sfield=store&fq={!frange l=5 u=10 cache=false cost=100}geodist()&fq={!bbox d=10}