我正在阅读以下文章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附带的默认值......
答案 0 :(得分:2)
实际上,bbox
和geofilt
空间过滤器将使用createSpatialQuery
,而默认(Lucene)查询解析器(使用语法[start TO end]
)将使用getRangeQuery
在这两种情况下,这些方法都会在子字段上使用getRangeQuery
。范围查询的类型取决于此子字段类型,可使用LatLon字段类型的subFieldType
或subFieldSuffix
属性进行配置。如果要使用数字范围查询,只需使用TrieDoubleField
。
例如
<fieldType name="tdouble" class="solr.TrieDoubleField" precisionStep="8" omitNorms="true" positionIncrementGap="0"/>
<fieldType name="latLon" class="solr.LatLonType" subFieldSuffix="_latLon"/>
<field name="lat_lon" type="latLon" indexed="true" stored="true"/>
<dynamicField name="*_latLon" type="tdouble" indexed="true" stored="false" multiValued="true"/>