0

目标是按分数然后距离执行多重排序,并将半径限制为 0.14 度,我执行以下查询:

localhost:8983/solr/coll1/select?sortsq={! score=distance}locations:"Intersects(Circle(34.0031792,-118.3082034 d=0.14))"&fl=score,distdeg:query($sortsq),*&facet=true&sort=score desc,query($sortsq) asc&indent=on&wt=xml&version=2.2&rows=10&start=0&q=text:*&facet.field=xxxxx&fq=fieldname:"filterValue"

返回所有匹配查询的文档,无论是否在圆圈内,但0.14度以内的返回距离(distdeg),其他不返回该字段。

如何省略不相交的文档?

位置字段声明:

<fieldType name="geo_field"   class="solr.SpatialRecursivePrefixTreeFieldType"
               spatialContextFactory="com.spatial4j.core.context.jts.JtsSpatialContextFactory"
               distErrPct="0.025"
               maxDistErr="0.000009"
               units="degrees"
 />

更新: 查询的工作版本

http://localhost:8983/solr/coll1/select?getDist={! score=distance}locations:"Intersects(Circle(34.0031792,-118.3082034 d=0.14))"&fl=score,distdeg:query($getDist),*&facet=true&sort=score desc&indent=on&wt=xml&version=2.2&rows=10&start=0&q=*:*&boost=query({! score=distdeg filter=false v=$getDist)&fq=locations:"Intersects(Circle(34.0031792,-118.3082034 d=0.14))",states:"CA"
4

1 回答 1

4

您实际上根本没有进行空间过滤。solr 搜索基于“q”(来自用户的查询字符串;它评分)和“fq”(过滤查询,不评分)匹配文档,仅此而已。您的“q”和“fq”都不是指您放入 sortsq 参数的空间过滤器。请参阅文档:http ://wiki.apache.org/solr/SolrAdaptersForLuceneSpatial4#Search

你的 q=text:* 很奇怪;你有什么打算?所有文档?该查询可能看起来有效,但不要这样做,因为它没有做你认为它在做的事情;它正在查找在该字段中具有任何值的所有文档(计算速度不快),这不是所有文档所必需的。最佳实践是 defType=edismax 和 q.alt=*:* 和 qf=text (假设这是您的文本搜索字段)如果您没有要提供的查询字符串,它将匹配所有文档。

顺便说一句,将分数排序与其他任何东西一起进行是没有任何意义的。浮点值种类繁多,因此很少会参考距离。您可能希望通过距离来提高分数。下面是一个示例: &boost=query({! score=recipDistance filter=false v=$spatialfilter}) (将具有空间搜索的参数名称替换为 spatialFilter)。

于 2013-01-21T19:18:47.447 回答