当前位置:   article > 正文

java elasticsearch 利用行折叠collapse 店铺去重,由近及远计算距离_elasticsearch collapse

elasticsearch collapse
  1. import com.alibaba.fastjson.JSONObject;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.elasticsearch.action.ActionFuture;
  4. import org.elasticsearch.action.search.SearchRequest;
  5. import org.elasticsearch.action.search.SearchResponse;
  6. import org.elasticsearch.client.transport.TransportClient;
  7. import org.elasticsearch.common.unit.DistanceUnit;
  8. import org.elasticsearch.index.query.BoolQueryBuilder;
  9. import org.elasticsearch.index.query.InnerHitBuilder;
  10. import org.elasticsearch.search.SearchHit;
  11. import org.elasticsearch.search.SearchHits;
  12. import org.elasticsearch.search.builder.SearchSourceBuilder;
  13. import org.elasticsearch.search.collapse.CollapseBuilder;
  14. import org.elasticsearch.search.sort.GeoDistanceSortBuilder;
  15. import org.elasticsearch.search.sort.ScoreSortBuilder;
  16. import org.elasticsearch.search.sort.SortOrder;
  17. import org.springframework.beans.factory.annotation.Autowired;
  18. import org.springframework.data.domain.Pageable;
  19. import org.springframework.web.bind.annotation.RequestMapping;
  20. import org.springframework.web.bind.annotation.RequestParam;
  21. import org.springframework.web.bind.annotation.RestController;
  22. import java.io.IOException;
  23. import java.util.ArrayList;
  24. import java.util.List;
  25. @RestController
  26. @Slf4j
  27. public class ShopAndGoodsTestController {
  28. @Autowired
  29. private TransportClient transportClient;
  30. private String indexname = "test_recomment_202402";// index 相当于数据库名称
  31. private String types = "test_type";//type 相当于表名称
  32. @RequestMapping("/test/getShopByGoodsName")
  33. public List<JSONObject> getShopByGoodsName(@RequestParam() Double latitude, @RequestParam() Double longitude,Pageable pageable) throws IOException {
  34. // 按距离升序
  35. GeoDistanceSortBuilder distanceSortBuilder = null;
  36. distanceSortBuilder = new GeoDistanceSortBuilder("location", latitude, longitude);
  37. distanceSortBuilder.unit(DistanceUnit.KILOMETERS);
  38. distanceSortBuilder.order(SortOrder.ASC);
  39. SearchRequest searchRequest = new SearchRequest(indexname);
  40. searchRequest.types(types);
  41. //折叠内
  42. InnerHitBuilder innerHit = new InnerHitBuilder();
  43. innerHit.setFrom(0);
  44. innerHit.setSize(5);
  45. innerHit.addSort(new ScoreSortBuilder());
  46. innerHit.setName("collapseShop");
  47. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  48. searchSourceBuilder.collapse(new CollapseBuilder("shopId").setInnerHits(innerHit));
  49. searchSourceBuilder.from((pageable.getPageNumber()-1)*pageable.getPageSize());
  50. searchSourceBuilder.size(pageable.getPageSize());
  51. BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
  52. searchSourceBuilder.query(boolQueryBuilder);
  53. if(null!=distanceSortBuilder){
  54. searchSourceBuilder.sort(distanceSortBuilder);
  55. }
  56. searchRequest.source(searchSourceBuilder);
  57. ActionFuture<SearchResponse> future = null;
  58. SearchHits searchHits =null;
  59. List<JSONObject> shops = new ArrayList<>();
  60. try {
  61. future = transportClient.search(searchRequest);
  62. searchHits = future.actionGet().getHits();
  63. } catch (Exception e) {
  64. e.printStackTrace();
  65. }
  66. if(null!=searchHits){
  67. SearchHit[] searchHitsTmp = searchHits.getHits();
  68. if(null!=searchHitsTmp && searchHitsTmp.length>0){
  69. for(SearchHit hit:searchHitsTmp){
  70. JSONObject jsonObject = new JSONObject();
  71. Object shopId = hit.getSourceAsMap().get("shopId");
  72. if(shopId ==null){
  73. continue;
  74. }
  75. String shopId1 = shopId.toString();
  76. jsonObject.put("shopId",Integer.parseInt(shopId1));
  77. jsonObject.put("距离",hit.getSortValues()[0]);
  78. shops.add(jsonObject);
  79. }
  80. }
  81. }
  82. return shops;
  83. }
  84. }
http://localhost:8080/test/getShopByGoodsName?page=1&size=10&longitude=113.32639940999642&latitude=32.156554113186026

返回结果

  1. [
  2. {
  3. "shopId": "1ff89166-25a0-4a4b-9583-a0a1446b66c5",
  4. "距离": 288.0428529445086
  5. },
  6. {
  7. "shopId": "e5a072dc-e951-447a-802f-feab8233a4a3",
  8. "距离": 289.15335981873034
  9. },
  10. {
  11. "shopId": "e4909095-3e8f-40df-a6e1-ba4e7e8864b8",
  12. "距离": 289.33576748935525
  13. },
  14. {
  15. "shopId": "f27e8c6f-57f3-45a3-b240-60e976fdd92b",
  16. "距离": 289.83143546296105
  17. },
  18. {
  19. "shopId": "9a34dc2c-f629-4398-a8c9-95cd78a58fa7",
  20. "距离": 289.83143546296105
  21. },
  22. {
  23. "shopId": "e3f6cb19-e226-4a46-b320-78335f39d7fb",
  24. "距离": 289.83143546296105
  25. },
  26. {
  27. "shopId": "ec2a1f05-ba7e-45c6-8629-704b7640764e",
  28. "距离": 289.83143546296105
  29. },
  30. {
  31. "shopId": "f91e2a05-7801-4ee8-bd86-7fd15eae7863",
  32. "距离": 290.0161990958708
  33. },
  34. {
  35. "shopId": "e6a72075-56dd-4a49-9590-d472d1e84aab",
  36. "距离": 290.0161990958708
  37. },
  38. {
  39. "shopId": "1f8972a0-b3d3-4392-b2a7-408053d24dc4",
  40. "距离": 290.0162339004875
  41. }
  42. ]

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/899430
推荐阅读
相关标签
  

闽ICP备14008679号