ElasticSearch 按照经纬度计算出距离并排序

这个其实已经困扰我一两天了,最终采用的方式是。1.创建索引的时候,使用mapping方式(目前注解使用@GeoPointField 竟然没有用),由于资料很少,目前没有去继续深究,不过使用mapping的方式成...

这个其实已经困扰我一两天了,最终采用的方式是。
1.创建索引的时候,使用mapping方式(目前注解使用@GeoPointField 竟然没有用),由于资料很少,目前没有去继续深究,不过使用mapping的方式成功了。如图:

1505028525(1).jpg


2.插入数据的时候:

    /##
     * 异步 添加数据到es
     * @param client
     */
    @Async
    public static void saveUserBookData(Client client,EsBook esBook) throws JsonProcessingException {
        String json = JSON.toJSONString(esBook);
        IndexRequest request = client
                .prepareIndex(EsBookConstants.USER_BOOK_INDEX_NAME,
                        EsBookConstants.USER_BOOK_TYPE_NAME)
                .setSource(json)
                .request();
        BulkRequestBuilder bulkRequest = client.prepareBulk();
        bulkRequest.add(request);
        BulkResponse bulkResponse = bulkRequest.execute().actionGet();
        logger.error("\n "+bulkResponse.buildFailureMessage());
        if (bulkResponse.hasFailures()) {
            logger.info("   ############   添加图书信息到es失败 #############   ");
        }else{
            logger.error("   #@@@@@@@@@@@   添加图书信息到es成功 @@@@@@@@@@@@@   ");
        }

    }


2.查询数据使用

 public static PageResponse searchBook(Client client, String keyWord,
                                          Integer pageNo,Double lon,Double lat,
                                          Double distance) {
        SearchRequestBuilder srb = client.prepareSearch(EsBookConstants.USER_BOOK_INDEX_NAME).setTypes(EsBookConstants.USER_BOOK_TYPE_NAME);
        // 关键词不为空,
        if(StringUtils.isNotEmpty(keyWord)){
            srb.setQuery(QueryBuilders.matchQuery("bookName", keyWord));
        }
        srb.setFrom(pageNo).setSize(Page.PAGE_SIZE);
        GeoDistanceQueryBuilder location1 = QueryBuilders.geoDistanceQuery("location").point(lat,lon).
                distance(distance,EsBookConstants.CURRENT_UNIT);
        srb.setPostFilter(location1);
        // 获取距离多少公里 这个才是获取点与点之间的距离的
        GeoDistanceSortBuilder sort = SortBuilders.geoDistanceSort("location");
        sort.unit(EsBookConstants.CURRENT_UNIT);
        sort.order(SortOrder.ASC);
        sort.point(lat,lon);
        srb.addSort(sort);

        SearchResponse searchResponse = srb.execute().actionGet();

        SearchHits hits = searchResponse.getHits();
        SearchHit searchHists = hits.getHits();
        // 搜索耗时
        Float usetime = searchResponse.getTookInMillis() / 1000f;
        logger.info("es 搜索书籍(" + hits.getTotalHits() + "本),耗时("+usetime+"秒):");
        List<EsBookResponse> results = new ArrayList<>();
        for (SearchHit hit : searchHists) {
            EsBookResponse esBookResponse = JSON.parseObject(hit.getSourceAsString(),EsBookResponse.class);
            BigDecimal geoDis = new BigDecimal((Double) hit.getSortValues()[0]);
            esBookResponse.setDistance(geoDis.setScale(0, BigDecimal.ROUND_HALF_DOWN));
            esBookResponse.setDistanceUnit(EsBookConstants.CURRENT_UNIT.toString());
            results.add(esBookResponse);
        }

        PageResponse pageResponse = new PageResponse();
        pageResponse.setData(results);
        pageResponse.setCurrentPage(pageNo);
        pageResponse.setShowCount(Page.PAGE_SIZE);
        pageResponse.setTotalResult((int) hits.getTotalHits());
        return  pageResponse;
    }


1505028785(1).jpg

  • 发表于 2017-11-14 16:37
  • 阅读 ( 5306 )
  • 分类:Java

0 条评论

请先 登录 后评论
不写代码的码农
威猛的小站长

124 篇文章

作家榜 »

  1. 威猛的小站长 124 文章
  2. Jonny 65 文章
  3. 江南烟雨 36 文章
  4. - Nightmare 33 文章
  5. doublechina 31 文章
  6. HJ社区-肖峰 29 文章
  7. 伪摄影 22 文章
  8. Alan 14 文章