赞
踩
- import com.alibaba.fastjson.JSONObject;
- import lombok.extern.slf4j.Slf4j;
- import org.elasticsearch.action.ActionFuture;
- import org.elasticsearch.action.search.SearchRequest;
- import org.elasticsearch.action.search.SearchResponse;
- import org.elasticsearch.client.transport.TransportClient;
- import org.elasticsearch.common.unit.DistanceUnit;
- import org.elasticsearch.index.query.BoolQueryBuilder;
- import org.elasticsearch.index.query.InnerHitBuilder;
- import org.elasticsearch.search.SearchHit;
- import org.elasticsearch.search.SearchHits;
- import org.elasticsearch.search.builder.SearchSourceBuilder;
- import org.elasticsearch.search.collapse.CollapseBuilder;
- import org.elasticsearch.search.sort.GeoDistanceSortBuilder;
- import org.elasticsearch.search.sort.ScoreSortBuilder;
- import org.elasticsearch.search.sort.SortOrder;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.data.domain.Pageable;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RequestParam;
- import org.springframework.web.bind.annotation.RestController;
-
- import java.io.IOException;
- import java.util.ArrayList;
- import java.util.List;
-
- @RestController
- @Slf4j
- public class ShopAndGoodsTestController {
-
- @Autowired
- private TransportClient transportClient;
- private String indexname = "test_recomment_202402";// index 相当于数据库名称
-
- private String types = "test_type";//type 相当于表名称
-
- @RequestMapping("/test/getShopByGoodsName")
- public List<JSONObject> getShopByGoodsName(@RequestParam() Double latitude, @RequestParam() Double longitude,Pageable pageable) throws IOException {
- // 按距离升序
- GeoDistanceSortBuilder distanceSortBuilder = null;
- distanceSortBuilder = new GeoDistanceSortBuilder("location", latitude, longitude);
- distanceSortBuilder.unit(DistanceUnit.KILOMETERS);
- distanceSortBuilder.order(SortOrder.ASC);
- SearchRequest searchRequest = new SearchRequest(indexname);
- searchRequest.types(types);
- //折叠内
- InnerHitBuilder innerHit = new InnerHitBuilder();
- innerHit.setFrom(0);
- innerHit.setSize(5);
- innerHit.addSort(new ScoreSortBuilder());
- innerHit.setName("collapseShop");
-
- SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
- searchSourceBuilder.collapse(new CollapseBuilder("shopId").setInnerHits(innerHit));
- searchSourceBuilder.from((pageable.getPageNumber()-1)*pageable.getPageSize());
- searchSourceBuilder.size(pageable.getPageSize());
-
- BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
- searchSourceBuilder.query(boolQueryBuilder);
- if(null!=distanceSortBuilder){
- searchSourceBuilder.sort(distanceSortBuilder);
- }
- searchRequest.source(searchSourceBuilder);
- ActionFuture<SearchResponse> future = null;
- SearchHits searchHits =null;
- List<JSONObject> shops = new ArrayList<>();
- try {
- future = transportClient.search(searchRequest);
- searchHits = future.actionGet().getHits();
- } catch (Exception e) {
- e.printStackTrace();
- }
- if(null!=searchHits){
- SearchHit[] searchHitsTmp = searchHits.getHits();
- if(null!=searchHitsTmp && searchHitsTmp.length>0){
- for(SearchHit hit:searchHitsTmp){
- JSONObject jsonObject = new JSONObject();
- Object shopId = hit.getSourceAsMap().get("shopId");
- if(shopId ==null){
- continue;
- }
- String shopId1 = shopId.toString();
- jsonObject.put("shopId",Integer.parseInt(shopId1));
- jsonObject.put("距离",hit.getSortValues()[0]);
- shops.add(jsonObject);
- }
- }
- }
- return shops;
- }
- }

http://localhost:8080/test/getShopByGoodsName?page=1&size=10&longitude=113.32639940999642&latitude=32.156554113186026
返回结果
- [
- {
- "shopId": "1ff89166-25a0-4a4b-9583-a0a1446b66c5",
- "距离": 288.0428529445086
- },
- {
- "shopId": "e5a072dc-e951-447a-802f-feab8233a4a3",
- "距离": 289.15335981873034
- },
- {
- "shopId": "e4909095-3e8f-40df-a6e1-ba4e7e8864b8",
- "距离": 289.33576748935525
- },
- {
- "shopId": "f27e8c6f-57f3-45a3-b240-60e976fdd92b",
- "距离": 289.83143546296105
- },
- {
- "shopId": "9a34dc2c-f629-4398-a8c9-95cd78a58fa7",
- "距离": 289.83143546296105
- },
- {
- "shopId": "e3f6cb19-e226-4a46-b320-78335f39d7fb",
- "距离": 289.83143546296105
- },
- {
- "shopId": "ec2a1f05-ba7e-45c6-8629-704b7640764e",
- "距离": 289.83143546296105
- },
- {
- "shopId": "f91e2a05-7801-4ee8-bd86-7fd15eae7863",
- "距离": 290.0161990958708
- },
- {
- "shopId": "e6a72075-56dd-4a49-9590-d472d1e84aab",
- "距离": 290.0161990958708
- },
- {
- "shopId": "1f8972a0-b3d3-4392-b2a7-408053d24dc4",
- "距离": 290.0162339004875
- }
- ]

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。