2012-06-03 57 views
2

我想用Solr做距离范围搜索。Solr距离滤波

我知道它很容易做搜索的5公里范围内筛选 &q=*:*&fq={!geofilt pt=45.15,-93.85 sfield=store d=5}

我是后是如何做同样的事情,如果我期待在一系列的说5 10公里 ??

谢谢

回答

9

这里有几种方法来解决这个问题。很显然,查询进入过滤器查询(“fq”参数),因为其意图不是修改分数。让我们假设的这些参数在请求URL设置(虽然他们有没有被放在那里):

pt=45.15,-93.85&sfield=store 

这里有一个办法:

_query_:"{!geofilt d=10}" -_query_:"{!geofilt d=5}" 

我用_QUERY_ Solr的语法进入一个子查询,它提供了将查询解析器从Lucene切换到地理切换器的机会。

这里的另一个办法,可能是最快的:

{!frange l=5 u=10}geodist() 

这一个是一个函数查询返回的距离,然后将其限制在所需范围。它可能会更快,因为它会评估每个文档一次,而不是像以前的意愿一样。

您可能希望将其标记为not cacheable并添加一个bbox过滤器,以便检查每个文档的数量少得多。 这里是最终结果(未URL转义):

pt=45.15,-93.85&sfield=store&fq={!frange l=5 u=10 cache=false cost=100}geodist()&fq={!bbox d=10} 
+0

Solr中4,用RPT字段类型使用的“geofilt”技术应该是更快,如果有在搜索结果中的一个“大”数。此外,如果您的空间域是多值的,那么您将不得不使用geofilt,并且还需要创建一个自定义聚合Spatial4j形状,其中包含一个外部圆,同时排除一个内部圆。即使您没有多值数据,这也会使geofilt方法更快。有时在不久的将来,可以指定一个甜甜圈形状,而无需编写自己的。 –