SOLR空间使用NumericRangeQuery

时间:2012-03-06 21:55:27

标签: java solr lucene

我正在阅读以下文章http://www.searchworkings.org/blog/-/blogs/the-state-and-future-of-spatial-search/,其中说明了

  

SpatialFilter,它使用基于NumericRangeQuery的边界框轻松过滤掉特定范围之外的文档。

稍微调查一下,我没有看到SOLR源代码中实际发生的事情:

http://grepcode.com/file/repo1.maven.org/maven2/org.apache.solr/solr-core/3.1.0/org/apache/solr/schema/LatLonType.java

即。在第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 个答案:

答案 0 :(得分:2)

实际上,bboxgeofilt空间过滤器将使用createSpatialQuery,而默认(Lucene)查询解析器(使用语法[start TO end])将使用getRangeQuery

在这两种情况下,这些方法都会在子字段上使用getRangeQuery。范围查询的类型取决于此子字段类型,可使用LatLon字段类型的subFieldTypesubFieldSuffix属性进行配置。如果要使用数字范围查询,只需使用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"/>