SOLR Пространственное использование NumericRangeQuery - PullRequest
1 голос
/ 07 марта 2012

Я читал следующую статью, 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. Переходя к javadoc NumericRangeQuery здесь 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, Java 1.5, шаг 8-битной точности). </p>

Мне действительно нужен супер быстрый NumericRangeQuery, но не похоже, чтобы я вынул его из коробки. Я должен что-то упустить.

EDIT:

LatLonType из schema.xml:

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

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

1 Ответ

2 голосов
/ 07 марта 2012

На самом деле, пространственные фильтры 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"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...