Геопространственный запрос SOLR Spring Data
Я использую динамические запросы для поиска в SOLR и пытаюсь выполнить сложный запрос геолокации для функции поиска магазинов. Он должен получить до 5 мест на расстоянии D от места (точки). Также следует отсортировать по расстоянию и вернуть расстояние в результате.
Я не могу понять, как заставить API выводить правильный запрос.
Может, кто-нибудь подскажет, как использовать Spring SOLR Data API для правильного вывода этого запроса?
Я использую функцию геофильтра SOLR 4+.
Мне нужен запрос SOLR (работает напрямую):
http://localhost:8983/solr/aust/select?q={!func}geodist()&fl=*,score,geodist()&fq={!geofilt}&pt=-37.818635,145.0014704&sfield=location&d=15&fq=docType:LOCATION&rows=5&wt=json&indent=true&sort=score asc
И мой код пока выглядит так (не работает):
@Override
public SimpleSearchResults searchByRegion (SimpleSearchForm searchForm, RegionDocument region)
{
logger.entry();
SimpleQuery query = new SimpleQuery();
query.addCriteria(new Criteria("text").contains(Criteria.WILDCARD));
int distance = 5;
Point point = new org.springframework.data.solr.core.geo.Point(region.getLat(), region.getLng());
GeoDistanceFunction geo = GeoDistanceFunction.distanceFrom("location").to(point);
query.addFilterQuery(new SimpleFilterQuery(Criteria.where(geo)));
SimpleFilterQuery typeQuery = new SimpleFilterQuery();
typeQuery.addCriteria(new Criteria("docType").is("LOCATION"));
Sort sort = new Sort(Sort.Direction.ASC, "score");
query.addFilterQuery(typeQuery);
// add paging to request
PageRequest page = new PageRequest(0, 5, sort);
query.setPageRequest(page);
// we build the search request without facets initially
//search.setPageRequest(page);
Page<LocationDocument> results = solrTemplate1.queryForPage(query, LocationDocument.class);
logger.exit();
SimpleSearchResults dto2 = new SimpleSearchResults();
dto2.setSearchTerm(searchForm.getSearchTerm());
dto2.setPage(results);
return dto2;
}
1 ответ
Для справки мне удалось заставить это работать после варианта решения, опубликованного здесь: Как вернуть расстояние и оценку в пространственном поиске, используя spring-data-solr
Поскольку я использую тип location_rpt в SOLR 4, функция geodist() не поддерживает этот тип. Таким образом, в документации они предлагают альтернативу возврата расстояния с помощью параметра Score. (обратите внимание, что он возвращается в градусах и должен быть конвертирован = если кто-то знает, как сделать это преобразование в SOLR, пожалуйста, опубликуйте его здесь).
Поэтому я использовал простые строковые критерии для добавления фразы оценка = расстояние в выражение Geofilter.
Вот мой код для получения результатов геофильтра, отсортированных по расстоянию с использованием Spring Data SOLR API и типа схемы location_rpt.
@Override
public SimpleSearchResults searchByRegion(SimpleSearchForm searchForm, RegionDocument region) {
logger.entry();
SimpleQuery query = new SimpleQuery();
query.addProjectionOnField("*");
query.addProjectionOnField("score");
StringBuffer buf = new StringBuffer("");
buf.append("{!geofilt pt=");
buf.append(region.getLat());
buf.append(",");
buf.append(region.getLng());
buf.append(" sfield=location d=");
buf.append(5.0);
buf.append(" score=distance}");
query.addCriteria(new SimpleStringCriteria(buf.toString()));
FilterQuery docType = new SimpleFilterQuery();
docType.addCriteria(new Criteria("docType").is("LOCATION"));
query.addFilterQuery(docType);
query.addSort(new Sort(Sort.Direction.ASC, "score"));
Page<LocationDocument> results = solrTemplate1.queryForPage(query, LocationDocument.class);
SimpleSearchResults dto2 = new SimpleSearchResults();
dto2.setSearchTerm(searchForm.getSearchTerm());
if (results.getContent().isEmpty()) {
logger.debug("results were empty.");
} else {
dto2.setPage(results);
}
logger.exit();
return dto2;
}