我正在阅读以下文章,http://www.searchworkings.org/blog/-/blogs/the-state-and-future-of-spatial-search/,其中说,
SpatialFilter,它使用基于NumericRangeQuery的边界框轻松过滤掉特定范围之外的文档 .
稍微调查一下,我没有看到SOLR源代码中实际发生的事情:
即在第201行,我看到:
Query latRange = latField.getType().getRangeQuery(parser, latField,
String.valueOf(latMin),String.valueOf(latMax),true, true);
这似乎使用TermRangeQuery . 在这里交叉到NumericRangeQuery javadoc http://lucene.apache.org/core/old_versioned_docs/versions/3_1_0/api/all/org/apache/lucene/search/NumericRangeQuery.html,似乎NumericRangeQuery绝对是可取的,因为它要快得多:
对具有约500,000个文档的索引上的不同类型的RangeQueries进行比较显示,布尔重写模式中的TermRangeQuery(具有凸起的BooleanQuery子句计数)需要大约30-40秒才能完成,而常量分数过滤器重写模式中的TermRangeQuery需要5秒并执行这个类花了<100ms完成(在Opteron64机器上,Java 1.5,8位精度步骤) .
我真的想要超快速的NumericRangeQuery,但它看起来并不像我开箱即用 . 我肯定错过了什么 .
编辑:
schema.xml中的LatLonType:
<fieldType name="location" class="solr.LatLonType" subFieldSuffix="_coordinate"/>
我认为,Solr附带的默认值是......
1 回答
实际上,
bbox
和geofilt
空间过滤器将使用createSpatialQuery
,而默认(Lucene)查询解析器(使用语法[start TO end]
)将使用getRangeQuery
.在这两种情况下,这些方法都会在子字段上使用
getRangeQuery
. 范围查询的类型取决于此子字段类型,可使用LatLon字段类型的subFieldType
或subFieldSuffix
属性进行配置 . 如果要使用数值范围查询,只需使用TrieDoubleField
的实例 .例如