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

java 复制代码
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;
    }
}
java 复制代码
http://localhost:8080/test/getShopByGoodsName?page=1&size=10&longitude=113.32639940999642&latitude=32.156554113186026

返回结果

java 复制代码
[
    {
        "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
    }
]
相关推荐
毕设源码-赖学姐12 分钟前
【开题答辩全过程】以 基于Springboot的智慧养老系统的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
jamesge201014 分钟前
限流之漏桶算法
java·开发语言·算法
jvstar15 分钟前
JAVA面试题和答案
java
冷雨夜中漫步16 分钟前
OpenAPITools使用——FAQ
android·java·缓存
9坐会得自创20 分钟前
使用marked将markdown渲染成HTML的基本操作
java·前端·html
Hello.Reader41 分钟前
Flink ML 线性 SVM(Linear SVC)入门输入输出列、训练参数与 Java 示例解读
java·支持向量机·flink
oioihoii42 分钟前
C++数据竞争与无锁编程
java·开发语言·c++
最贪吃的虎42 分钟前
什么是开源?小白如何快速学会开源协作流程并参与项目
java·前端·后端·开源
资生算法程序员_畅想家_剑魔43 分钟前
Java常见技术分享-16-多线程安全-并发编程的核心问题
java·开发语言