Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring数据弹性搜索-按距离对地理位置排序_Java_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch_Spring Data - Fatal编程技术网 elasticsearch,spring-data,Java,elasticsearch,Spring Data" /> elasticsearch,spring-data,Java,elasticsearch,Spring Data" />

Java Spring数据弹性搜索-按距离对地理位置排序

Java Spring数据弹性搜索-按距离对地理位置排序,java,elasticsearch,spring-data,Java,elasticsearch,Spring Data,给定一个地理位置点,我试图找到10公里内的一些地点,并按离给定位置最近的地点进行排序 我设法返回了10公里范围内的位置列表,但当我尝试对其进行排序时,出现了异常: 我正在使用以下版本的: <properties> <commonscollections>3.2.1</commonscollections> <commonslang>2.6</commonslang> <spring.

给定一个地理位置点,我试图找到10公里内的一些地点,并按离给定位置最近的地点进行排序

我设法返回了10公里范围内的位置列表,但当我尝试对其进行排序时,出现了异常:

我正在使用以下版本的:

<properties>
        <commonscollections>3.2.1</commonscollections>
        <commonslang>2.6</commonslang>
        <spring.data.elasticsearch>1.0.0.BUILD-SNAPSHOT</spring.data.elasticsearch>
        <springversion>3.2.5.RELEASE</springversion>
</properties>
然后代码将返回所有位置,问题在于排序

我从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 List<SiteResource> findByGeoLocation(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<SiteResource> sites = esTemplate.queryForList(searchQuery, com.company.domain.site.SiteResource.class);
        return sites;
    }
公共列表findByGeoLocation(双经度、双纬度、字符串通道键、双距离){
if(StringUtils.isEmpty(距离)){
距离=默认半径;
}
GeodistanceFilterBuilderFilter=FilterBuilders.geoDistanceFilter(“位置”)。点(纬度、经度)。距离(距离、距离单位。公里);
SearchQuery SearchQuery=new NativeSearchQueryBuilder()
.带过滤器(过滤器)
.withSort(SortBuilders.geoDistanceSort(“site.location”).point(纬度、经度).order(SortOrder.ASC)).build();
searchQuery.additions(channelKey);
searchQuery.addTypes(“站点”);
List sites=esTemplate.queryForList(searchQuery,com.company.domain.site.SiteResource.class);
返回站点;
}

希望它能帮助别人;)

来自@justMe的答案有助于找到实现地理距离搜索的最新可能性。 随着过滤器和查询的合并,我们可以使用QueryBuilder

这就是我获得结果的方式(排序和分页):

公共列表findByGeoLocationSorted(双纬度、双经度、,
双距离、字符串排序、可分页(可分页){
GeoDistanceQueryBuilder过滤器=QueryBuilders.geoDistanceQuery(“地理点”)
.点(纬度、经度)。距离(距离、距离单位。公里);
SearchQuery SearchQuery=new NativeSearchQueryBuilder()
.withQuery(筛选器).withPageable(可分页)
.with排序(SortBuilders.geoDistanceSort(“地理点”、纬度、经度)。顺序(
SortOrder.fromString(sort)).build();
页面=elasticsearchRestTemplate
.QueryFormage(searchQuery,EsEntity.class);
if(page.hasContent()){
返回page.getContent();
}
返回集合。emptyList();
}

“geoPoint”->elasticsearch实体中的geoPoint字段。

游戏进行得很晚,但自从上周发布的Spring Data elasticsearch 4.0以来,有一个选项可以为
排序定义
地理距离顺序,该排序可以传递到存储库方法

搜索结果中的距离值可以从返回的
SearchHit
对象中读取


我详细介绍了如何做到这一点

您不需要定义elasticsearch版本,因为它将作为spring data elasticsearch的暂时依赖项。您说得对,我刚刚从问题Pj中删除了它,那篇文章看起来很棒,让我试试:)
[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 List<SiteResource> findByGeoLocation(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<SiteResource> sites = esTemplate.queryForList(searchQuery, com.company.domain.site.SiteResource.class);
        return sites;
    }
  public List<EsEntity> findByGeoLocationSorted(Double latitude, Double longitude,
      Double distance, String sort, Pageable pageable) {

    GeoDistanceQueryBuilder filter = QueryBuilders.geoDistanceQuery("geoPoint")
        .point(latitude, longitude).distance(distance, DistanceUnit.KILOMETERS);

    SearchQuery searchQuery = new NativeSearchQueryBuilder()
        .withQuery(filter).withPageable(pageable)
        .withSort(SortBuilders.geoDistanceSort("geoPoint", latitude, longitude).order(
            SortOrder.fromString(sort))).build();

    Page<EsEntity> page = elasticsearchRestTemplate
        .queryForPage(searchQuery, EsEntity.class);
    if (page.hasContent()) {
      return page.getContent();
    }
    return Collections.emptyList();
  }