首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ES进阶 -- Java客户端

ES进阶 -- Java客户端

作者头像
用户10521079
发布于 2023-05-04 11:07:55
发布于 2023-05-04 11:07:55
1.7K00
代码可运行
举报
文章被收录于专栏:Smile博客Smile博客
运行总次数:0
代码可运行

1. java集成es快速入门

参照

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 //快速入门
    @Test
    void  testmatchall() throws IOException {
       //1.准备request
        SearchRequest request = new SearchRequest("hotel");
        //2. 准备dsl
         request.source().query(QueryBuilders.matchAllQuery());
        //3.发送请求
        SearchResponse response =   client.search(request,RequestOptions.DEFAULT);
        //4.解析响应
        SearchHits searchHits = response.getHits();
        //4.1 获取总条数
        long total = searchHits.getTotalHits().value;
        System.out.println("共搜索到:"+ total);
        //4.2文档数组
        SearchHit[] hits = searchHits.getHits();
        //4.3遍历
        for (SearchHit hit : hits){
            //得到json
            String json = hit.getSourceAsString();
            //转换对象
            HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
            System.out.println("hotelDoc = " + hotelDoc);
        }
        System.out.println(response);

    }

2.java 实现排序

3. Java 实现高亮

4.java实现地理坐标

解析地理坐标的距离

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private PageResult handleResponse(SearchResponse response) {
        //4.解析响应
        SearchHits searchHits = response.getHits();
        //4.1获取总条数
        long total = searchHits.getTotalHits().value;
        //4.2文档数组
        SearchHit[] hits = searchHits.getHits();
        //4.3遍历
        List<HotelDoc> hotels = new ArrayList<>();
        for (SearchHit hit : hits){
            //获取文档source
            String json = hit.getSourceAsString();
            //反序列化
            HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
            //获取排序值
            Object[] sortValues = hit.getSortValues();
            if (sortValues.length > 0 ){
                Object sortValue = sortValues[0];
                hotelDoc.setDistance(sortValue);
            }

            hotels.add(hotelDoc);
        }
        //4.4封装返回
        return new PageResult(total,hotels);
    }

##5. 算分控制

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    //2.算分控制
        FunctionScoreQueryBuilder functionScoreQuery =
                   QueryBuilders.functionScoreQuery(
                           //原始查询,做相关性算分
                           boolQueryBuilder,
                           //function score数组
                           new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{
                                   //其中一个function score元素
                                new FunctionScoreQueryBuilder.FilterFunctionBuilder(
                                        //过滤条件
                                        QueryBuilders.termQuery("isAD",true),
                                        //算分函数
                                        ScoreFunctionBuilders.weightFactorFunction(10)
                                )
                });

6.聚合函数

7.综合案例 service

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Service
public class HotelService  implements IHotelService {

    @Autowired
    public HotelMapper hotelMapper;
    @Autowired
    private RestHighLevelClient client;


    @Override
    public List<Hotel> listhotel() {
      System.out.println(hotelMapper.listhotel());
        return hotelMapper.listhotel();
    }

    @Override
    public Hotel getById(long id) {

        return hotelMapper.getById(id);
    }

    @Override
    public PageResult search(RequestParams params) {
        try {
            //1.准备request
            SearchRequest request = new SearchRequest("hotel");
            //2.准备dsl
            //2.1 query查询
            buildBaisc(params, request);

            //2.2 分页
            int page = params.getPage();
            int size = params.getSize();
            request.source().from((page - 1) * size).size(size);

            //2.3排序
            String location = params.getLocation();
             if (location != null && !location.equals("")){
                request.source().sort(SortBuilders
                        .geoDistanceSort("location",new GeoPoint(location))
                        .order(SortOrder.ASC)
                        .unit(DistanceUnit.KILOMETERS)
                );
             }

            //3.发送请求
            SearchResponse response = client.search(request, RequestOptions.DEFAULT);
            //4.解析响应
            return handleResponse(response);

        } catch (IOException e) {
            e.printStackTrace();
            throw  new RuntimeException();
        }
    }


    public Map<String, List<String>> filters(RequestParams params){
        
        try {
        //1.准备reuest
        SearchRequest request = new SearchRequest("hotel");
        //2.准备dsl
        //2.1准备query
        buildBaisc(params, request);
        //2.1 设置size
        request.source().size(0);
        //2.2聚合
        buildAggregation(request);
        /* 3.发出 */
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
            System.out.println("response = " + response);
        //4.解析结果
        Map<String,List<String>> result = new HashMap<>();
        Aggregations aggregations = response.getAggregations();
        //4.1根据品牌获取品牌结果
        List<String> brandList =  getAggByname(aggregations,"brandAgg");
        result.put("品牌",brandList);
        //4.2根据品牌获取品牌结果
        List<String> cityList =  getAggByname(aggregations,"cityAgg");
        result.put("城市",cityList);
        //4.3根据品牌获取品牌结果
        List<String> starList =  getAggByname(aggregations,"starNameAgg");
        result.put("星级",starList);
       
        return result;
        
        } catch (IOException e) {
             throw  new RuntimeException();
        }
    }

    private List<String> getAggByname(Aggregations aggregations, String aggName) {
        //4.1根据聚合名称获取聚合结果
        Terms brandTerms = aggregations.get(aggName);
        //4.2获取buckets
        List<? extends Terms.Bucket> buckets = brandTerms.getBuckets();
        //4.3遍历
        List<String> brandList = new ArrayList<>();
        for (Terms.Bucket bucket:buckets){
            //4.4获取key
            String key = bucket.getKeyAsString();
             brandList.add(key);
        }
        return brandList;
    }

    private void buildAggregation(SearchRequest request) {
        request.source().aggregation(AggregationBuilders
                .terms("brandAgg")
                .field("brand")
                .size(100)
        );
        request.source().aggregation(AggregationBuilders
                .terms("cityAgg")
                .field("city")
                .size(100)
        );
        request.source().aggregation(AggregationBuilders
                .terms("starNameAgg")
                .field("starName")
                .size(100)
        );
    }

    private void buildBaisc(RequestParams params, SearchRequest request) {

        // 1.构建BooleanQuery
        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();

        String key = params.getKey();
        if (key == null ||  "".equals(key)) {
            boolQuery.must(QueryBuilders.matchAllQuery());
        } else {
            boolQuery.must(QueryBuilders.matchQuery("all", key));
        }
        // 城市条件
        if (params.getCity() != null && !params.getCity().equals("")){
            boolQuery.filter(QueryBuilders.termQuery("city", params.getCity()));
        }
        //品牌条件
        if (params.getBrand() !=null && !params.getBrand().equals("")){
            boolQuery.filter(QueryBuilders.termQuery("brand", params.getBrand()));
        }
        //星级条件
        if (params.getStarName() !=null && !params.getStarName().equals("")){
            System.out.println(params.getStarName());
            boolQuery.filter(QueryBuilders.termQuery("starName", params.getStarName()));
        }
        //价格条件
        if ( params.getMinPrice()!=null && params.getMaxPrice()!=null){
            boolQuery.filter(QueryBuilders.rangeQuery("price").gte(params.getMinPrice()).lte(params.getMaxPrice()));
        }

        //2.算分控制
        FunctionScoreQueryBuilder functionScoreQuery =
                   QueryBuilders.functionScoreQuery(
                           //原始查询,做相关性算分
                           boolQuery,
                           //function score数组
                           new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{
                                   //其中一个function score元素
                                new FunctionScoreQueryBuilder.FilterFunctionBuilder(
                                        //过滤条件
                                        QueryBuilders.termQuery("aD",true),
                                        //算分函数
                                        ScoreFunctionBuilders.weightFactorFunction(10)
                                )
                });

        request.source().query(functionScoreQuery);
    }


    private PageResult handleResponse(SearchResponse response) {
        //4.解析响应
        SearchHits searchHits = response.getHits();
        //4.1获取总条数
        long total = searchHits.getTotalHits().value;
        //4.2文档数组
        SearchHit[] hits = searchHits.getHits();
        //4.3遍历
        List<HotelDoc> hotels = new ArrayList<>();
        for (SearchHit hit : hits){
            //获取文档source
            String json = hit.getSourceAsString();
            //反序列化
            HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
            //获取排序值
            Object[] sortValues = hit.getSortValues();
            if (sortValues.length > 0 ){
                Object sortValue = sortValues[0];
                hotelDoc.setDistance(sortValue);
            }

            hotels.add(hotelDoc);
        }
        //4.4封装返回
        return new PageResult(total,hotels);
    }

}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Clickhouse 迁移到 Doris 的最佳实践
在将数据从 Clickhouse 迁移到 Apache Doris / SelectDB Cloud 的过程中,涉及表结构迁移、查询语句迁移以及数据迁移等多个关键环节。每个环节都有其复杂性和需要注意的细节,本文将详细介绍这些内容及对应的最佳实践方法。
数据极客圈
2025/07/14
1760
Clickhouse 迁移到 Doris 的最佳实践
小程序是如何设计百亿级用户画像分析系统的?
导语 | We 分析是微信小程序官方推出的、面向小程序服务商的数据分析平台,其中画像洞察是一个非常重要的功能模块。微信开发工程师钟文波将描述 We 分析画像系统各模块是如何设计,在介绍基础标签模块之后,重点讲解用户分群模块设计。希望相关的技术实现思路,能够对你有所启发。 目录 1 背景介绍    1.1 画像系统简述    1.2 画像系统设计目标 2 画像系统整体概述 3 基础标签模块    3.1 功能描述    3.2 技术实现 4 用户分群模块    4.1 功能描述    4.2 人群包实时预估
腾讯云开发者
2023/03/10
2.6K0
小程序是如何设计百亿级用户画像分析系统的?
Clickhouse在大数据分析平台-留存分析上的应用
导语 | 本文实践了对于千万级别的用户,操作总数达万级别,每日几十亿操作流水的留存分析工具秒级别查询的数据构建方案。同时,除了留存分析,对于用户群分析,事件分析等也可以尝试用此方案来解决。 文章作者:陈璐,腾讯高级数据分析师   背景 你可能听说过Growingio、神策等数据分析平台,本文主要介绍实现留存分析工具相关的内容。 留存分析是一种用来分析用户参与情况/活跃程度的分析模型,可考查进行初始行为后的用户中,有多少人会进行后续行为,这是衡量产品对用户价值高低的重要指标。如,为评估产品更新效果或渠道推广
腾讯云大数据
2020/08/07
3.8K1
ClickHouse SQL 语法基础极简教程 + bitmap 位图数据类型的使用实例
Application: Listening for http://127.0.0.1:8123
一个会写诗的程序员
2022/03/07
2.8K0
ClickHouse SQL 语法基础极简教程 + bitmap 位图数据类型的使用实例
Clickhouse学习系列——一条SQL完成gourp by分组与不分组数值计算
       笔者在近一两年接触了Clickhouse数据库,在项目中也进行了一些实践,但一直都没有一些技术文章的沉淀,近期打算做个系列,通过一些具体的场景将Clickhouse的用法进行沉淀和分享,供大家参考。
粲然
2023/10/12
6000
Clickhouse学习系列——一条SQL完成gourp by分组与不分组数值计算
人群创建的基础:画像标签BitMap
​上文提到了使用画像宽表可以便捷的创建人群,本文介绍人群创建所依赖的另外一种数据组织形式:标签BitMap。
张叔叔讲互联网
2023/10/17
1.5K0
人群创建的基础:画像标签BitMap
【ClickHouse为什么这么快?】MergeTree 表存储引擎图文实例详解
ClickHouse 是俄罗斯最大的搜索引擎Yandex在2016年开源的数据库管理系统(DBMS),主要用于联机分析处理(OLAP)。其采用了面向列的存储方式,性能远超传统面向行的DBMS,近几年受到广泛关注。
一个会写诗的程序员
2021/12/16
2.1K0
【ClickHouse为什么这么快?】MergeTree 表存储引擎图文实例详解
ClickHouse 源码解析(一):SQL 的一生(上)
基于 ClickHouse version 22.10.1 学习并写下 ClickHouse 源码解析系列。由于 CK 版本迭代很快,可能导致代码可能有些出入,但是整体流程大差不差吧。由于源码阅读过于枯燥,并且不太利于后续复习,所以在逻辑梳理时,我会使用思维导图或者流程图的方式来描述类与类之间的调用逻辑,后半部分会挑出核心的源码去分析。
用户8447023
2022/10/28
2K0
大数据ClickHouse进阶(十八):数据字典类型
在创建字典表语句中使用“layout”来指定字典的类型,目前扩展字典支持7种类型,分别为flat、hashed、range_hashed、cache、complex_key_hashed、complex_key_cache、ip_trie,不同的字典类型决定了数据在内存中以何种结构组织和存储。
Lansonli
2022/10/17
1K0
大数据ClickHouse进阶(十八):数据字典类型
ClickHouse 集群部署(不需要 Zookeeper)
(1)安装 ClickHouse Server 和 ClickHouse Client
用户1148526
2024/04/18
10.1K2
ClickHouse(21)ClickHouse集成Kafka表引擎详细解析
ClickHouse可以接受和返回各种格式的数据。受支持的输入格式可用于提交给INSERT语句、从文件表(File,URL,HDFS或者外部目录)执行SELECT语句,受支持的输出格式可用于格式化SELECT语句的返回结果,或者通过INSERT写入到文件表。
张飞的猪
2024/06/07
6220
ClickHouse(21)ClickHouse集成Kafka表引擎详细解析
ClickHouse实战留存、路径、漏斗、session
关于用户留存模型是各大商业数据分析平台必不可少的功能,企业一般用该模型衡量用户的活跃情况,也是能直接反应产品功能价值的直接指标;如,boss想要了解商城改版后,对用户加购以及后续下单情况的影响等。如下图,这就是一个典型的留存分析功能:
小晨说数据
2022/03/10
2.3K0
ClickHouse实战留存、路径、漏斗、session
​深入浅出 ClickHouse 物化视图
数据库查询语言(query language)是数据库管理系统(DBMS)提供给用户和数据库交互的工具,查询语言分为三类 [^1]:
腾讯技术工程官方号
2023/07/15
2.8K0
​深入浅出 ClickHouse 物化视图
一文读懂:画像平台人群包产出进阶之路
本文将以规则人群为例,完整地描述人群创建耗时从十几分钟降低到秒级响应的优化进阶过程。
张叔叔讲互联网
2023/11/04
7460
一文读懂:画像平台人群包产出进阶之路
一文入门 | 性能凶悍的开源分析数据库ClickHouse
ClickHouse是一个开源的,面向列的MPP架构数据分析数据库(大规模并行处理),由俄罗斯Yandex为OLAP和大数据用例创建。
灵雀云
2022/06/06
4K0
一文入门 | 性能凶悍的开源分析数据库ClickHouse
利用Null引擎和物化视图构建数据管道
不知各位在使用 AggregatingMergeTree 这个神器表引擎的时候,有没有觉得过很别扭,反正我有...
Nauu
2021/04/29
1.3K1
利用Null引擎和物化视图构建数据管道
Clickhouse在大数据分析平台-留存分析上的应用
你可能听说过Growingio、神策等数据分析平台,所在部门也在构建自己的大数据分析平台MVP(地址:http://mvp.wsd.com),本文主要介绍实现留存分析工具相关的内容。
腾讯云大数据
2021/01/07
2.3K0
画像平台人群创建方式-规则人群创建
规则圈选是按照指定条件从画像数据中找到满足要求的用户并沉淀为人群的一种常见的人群创建方式。所谓的规则就是条件的组合,比如北京市男性用户,最近一周平均在线时长介于2到10分钟之间的中老年用户。规则圈选的实现依赖画像宽表数据或者BitMap数据,其实现逻辑如图5-12所示。
张叔叔讲互联网
2023/10/18
8770
画像平台人群创建方式-规则人群创建
面试杀手锏:Redis源码之BitMap
在上文《面试杀手锏:Redis源码之SDS》中我们深入分析了 SDS 的实现,本次介绍的位图(BitMap)就是借助 SDS 实现的。
敖丙
2022/03/24
9880
面试杀手锏:Redis源码之BitMap
Bitmap用户分群在贝壳DMP的实践和应用
DMP数据管理平台是实现用户精细化运营和和全生命周期运营的的基础平台之一。贝壳找房从2018年5月开始建设自己的DMP平台,提供了用户分群、消息推送、人群洞察等能力。关于贝壳DMP架构的介绍可参考文章:DMP平台在贝壳的实践和应用。
smartsi
2020/08/24
5.2K1
Bitmap用户分群在贝壳DMP的实践和应用
推荐阅读
相关推荐
Clickhouse 迁移到 Doris 的最佳实践
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验