给定一个地理位置点,我试图在10公里范围内找到一些网站,并按最近的位置对其进行排序.
我设法返回10公里范围内的位置列表,但是当我尝试对其进行排序时,我得到了例外情况:
我使用以下版本:
3.2.1 2.6 1.0.0.BUILD-SNAPSHOT 3.2.5.RELEASE
java代码如下:
public ListfindByGeoLocation(Double longitude, Double latitude, String channelKey, String distance) { if(StringUtils.isEmpty(distance)){ distance = defaultRadius; } GeoPoint location = new GeoPoint(latitude, longitude); CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("location").within(location, distance+"km")); criteriaQuery.addIndices(channelKey); criteriaQuery.addTypes("site"); criteriaQuery.addSort(new Sort(Sort.Direction.ASC, "location")); List sites = esTemplate.queryForList(criteriaQuery, com.company.domain.site.SiteResource.class); return sites; }
如果我删除该行:
criteriaQuery.addSort(new Sort(Sort.Direction.ASC, "location"));
然后代码将返回所有位置,问题在于排序
我从elasticsearch日志得到的错误:
[2014-03-20 13:37:02,720][DEBUG][action.search.type ] [Smuggler II] [210a9696a28545f2bbeecf88d64fbad8_20140318_153743][4], node[dB9dCIXMRZGmdUExquMWlQ], [P], s[STARTED]: Failed to execute [org.elasticsearch.action.search.SearchRequest@71b978fe] lastShard [true] org.elasticsearch.search.SearchParseException: [210a9696a28545f2bbeecf88d64fbad8_20140318_153743][4]: query[ConstantScore(*:*)],from[0],size[-1]: Parse Failure [Failed to parse source [{"from":0,"query":{"match_all":{}},"post_filter":{"geo_distance":{"location":[-2.217753,53.432703],"distance":"10km"}},"sort":[{"location":{"order":"asc"}}]}]] at org.elasticsearch.search.SearchService.parseSource(SearchService.java:595) at org.elasticsearch.search.SearchService.createContext(SearchService.java:498) at org.elasticsearch.search.SearchService.createAndPutContext(SearchService.java:472) at org.elasticsearch.search.SearchService.executeDfsPhase(SearchService.java:178) at org.elasticsearch.search.action.SearchServiceTransportAction.sendExecuteDfs(SearchServiceTransportAction.java:168) at org.elasticsearch.action.search.type.TransportSearchDfsQueryThenFetchAction$AsyncAction.sendExecuteFirstPhase(TransportSearchDfsQueryThenFetchAction.java:85) at org.elasticsearch.action.search.type.TransportSearchTypeAction$BaseAsyncAction.performFirstPhase(TransportSearchTypeAction.java:216) at org.elasticsearch.action.search.type.TransportSearchTypeAction$BaseAsyncAction.performFirstPhase(TransportSearchTypeAction.java:203) at org.elasticsearch.action.search.type.TransportSearchTypeAction$BaseAsyncAction$2.run(TransportSearchTypeAction.java:186) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:701) Caused by: org.elasticsearch.ElasticsearchIllegalArgumentException: can't sort on geo_point field without using specific sorting feature, like geo_distance at org.elasticsearch.index.fielddata.plain.AbstractGeoPointIndexFieldData.comparatorSource(AbstractGeoPointIndexFieldData.java:142) at org.elasticsearch.search.sort.SortParseElement.addSortField(SortParseElement.java:222) at org.elasticsearch.search.sort.SortParseElement.addCompoundSortField(SortParseElement.java:172) at org.elasticsearch.search.sort.SortParseElement.parse(SortParseElement.java:80) at org.elasticsearch.search.SearchService.parseSource(SearchService.java:583) ... 11 more [2014-03-20 13:37:02,722][DEBUG][action.search.type ] [Smuggler II] All shards failed for phase: [dfs]
如果有人告诉我是否可以按离我最近的位置排序,我非常感激.
提前谢谢了
为了防止其他人遇到同样的问题,我们通过以下方式解决了排序问题:
public ListfindByGeoLocation(Double longitude, Double latitude, String channelKey, Double distance) { if(StringUtils.isEmpty(distance)){ distance = defaultRadius; } GeoDistanceFilterBuilder filter = FilterBuilders.geoDistanceFilter("location").point(latitude, longitude).distance(distance, DistanceUnit.KILOMETERS); SearchQuery searchQuery = new NativeSearchQueryBuilder() .withFilter(filter) .withSort(SortBuilders.geoDistanceSort("site.location").point(latitude, longitude).order(SortOrder.ASC)).build(); searchQuery.addIndices(channelKey); searchQuery.addTypes("site"); List sites = esTemplate.queryForList(searchQuery, com.company.domain.site.SiteResource.class); return sites; }
希望它可以帮助某人;)