首页 文章

SOLR空间使用NumericRangeQuery

提问于
浏览
1

我正在阅读以下文章,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 回答

  • 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"/>
    

相关问题