2012-03-06 4 views
1

Я читал в следующей статье, http://www.searchworkings.org/blog/-/blogs/the-state-and-future-of-spatial-search/, в котором говорится,SOLR Пространственное использование NumericRangeQuery

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, безусловно, предпочтительнее, так как это гораздо быстрее:

Сравнение различных типов RangeQueries по индексу с приблизительно 500 000 докторов показал, что TermRangeQuery в режиме булевой переписывания (с увеличенным кол-вом предложения BooleanQuery) заняло около 30-40 секунд, TermRangeQuery в режиме перезапуска фильтра с фиксированным счетом занял 5 секунд, а для выполнения этого класса потребовалось < 100 мс (на машине Opteron64, шаг 1.5).

Я очень хочу, чтобы uber быстро NumericRangeQuery, но это не похоже, что я получаю его из коробки. Я должен что-то упустить.

EDIT:

LatLonType из schema.xml:

<fieldType name="location" class="solr.LatLonType" subFieldSuffix="_coordinate"/> 

Что я думаю, по умолчанию, поставляемая с Solr ...

+0

Вы можете вставить определение своей области LatLon? – jpountz

ответ

2

На самом деле, bbox и geofilt пространственные фильтры используйте createSpatialQuery, тогда как анализатор запросов по умолчанию (Lucene) (используя синтаксис [start TO end]) будет использовать getRangeQuery.

В обоих случаях эти методы используют getRangeQuery в подполях. Тип запроса диапазона будет зависеть от этого типа подполя, который настраивается с использованием атрибута subFieldType или subFieldSuffix типа поля LatLon. Если вы хотите использовать числовые запросы диапазона, просто используйте экземпляр 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"/> 
+0

привет, пожалуйста, просмотрите обновленный вопрос ... – Kevin

+0

Спасибо. Я также добавил пример. Если вы используете конфигурацию по умолчанию, то вы, вероятно, уже используете NumericRangeQuery. – jpountz

+0

, так что вы говорите, что если динамический тип для _coordinate равен tdouble, то он использует NumericRangeQuery? – Kevin

Смежные вопросы