【问题标题】:Solr Distance FilteringSolr 距离过滤
【发布时间】:2012-06-03 00:58:32
【问题描述】:

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

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

如果我在 5 到 10 公里 的范围内寻找,我所追求的是如何做同样的事情??

谢谢

【问题讨论】:

    标签: solr filter geospatial


    【解决方案1】:

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

    pt=45.15,-93.85&sfield=store
    

    这是一种方法:

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

    我使用 _query_ Solr 语法 hack 输入了一个子查询,它提供了将查询解析器从 Lucene 切换到 geo 的机会。

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

    {!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}
    

    【讨论】:

    • 在 Solr 4 中,如果搜索中有“大量”结果,则与 RPT 字段类型一起使用的“geofilt”技术应该更快。此外,如果您的空间字段是多值的,那么您将不得不使用 geofilt 并且您还需要创建一个自定义的聚合 Spatial4j 形状,其中包括一个外圆而排除一个内圆。即使您没有多值数据,这也将使 geofilt 方法更快。在不久的将来的某个时候,无需自己编写即可指定甜甜圈形状。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-27
    • 2012-04-19
    • 1970-01-01
    • 2011-03-12
    • 2018-06-17
    • 1970-01-01
    相关资源
    最近更新 更多