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
    }
]
相关推荐
逸Y 仙X2 分钟前
文章二十四:Elasticsearch查询排序应用实战e
java·大数据·数据库·elasticsearch·搜索引擎·全文检索
aXin_ya1 小时前
微服务 第十天 (Redis多级缓存)
java·redis·微服务
逸Y 仙X1 小时前
文章二十五:ElasticSearch 分页查询
java·大数据·数据库·elasticsearch·搜索引擎·全文检索
ch.ju1 小时前
Java programming(The third edition) Chapter Two——Null return value
java·开发语言
1.14(java)2 小时前
Spring事务和事务传播机制
java·数据库·spring
AI人工智能+电脑小能手2 小时前
【大白话说Java面试题】【Java基础篇】第34题:String、StringBuffer和StringBuilder的区别是什么
java·后端·面试
晓庆的故事簿2 小时前
JAVA搭配RabbitMQ使用
java·rabbitmq·java-rabbitmq
折哥的程序人生 · 物流技术专研2 小时前
第3篇:为何要配置环境变量?
java·开发语言·后端·面试
阿里云大数据AI技术2 小时前
重构搜索范式:阿里云 Elasticsearch 开启“Agent 原生”时代,打造企业级 AI 记忆湖
人工智能·elasticsearch·阿里云·agent·搜索
渔民小镇2 小时前
4 行代码接入 Spring —— ionet 的生态融合之道
java·服务器·分布式·游戏