这个其实已经困扰我一两天了,最终采用的方式是。
1.创建索引的时候,使用mapping方式(目前注解使用@GeoPointField 竟然没有用),由于资料很少,目前没有去继续深究,不过使用mapping的方式成功了。如图:
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; }
124 篇文章
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!