Spring整合Elasticsearch(2)

news2024/11/23 19:36:01

        原生查询

        可以查询的范围更精确,当ElasticsearchRepository提供的基本方法无法满足我们所需要的查询可以使用原生的方式查询

 @Test//原生查询
    public void naticeQuery(){
        //创建原生查询构建器对象
        NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
       //过滤条件
        queryBuilder.withSourceFilter(new FetchSourceFilter(new String[]{"id","title","price"},new String[0]));
        //搜索条件
        queryBuilder.withQuery(QueryBuilders.matchQuery("title","荣耀"));
        //分页及排序条件      当前页起始数据的下标      每页的大小          排列的顺序
        queryBuilder.withPageable(PageRequest.of(0,2,Sort.by(Sort.Direction.DESC,"price")));
        //高亮显示 TODO
        //聚合      terms()方法指定分组的名称(聚合名称),field方法指定要按照哪一个字段进行分组
        queryBuilder.addAggregation(AggregationBuilders.terms("brandAgg").field("brand"));
        //构建查询条件,并且查询
        AggregatedPage<Producter> result = template.queryForPage(queryBuilder.build(), Producter.class);

        //解析结果
        System.out.println("总条数:"+result.getTotalElements());
        System.out.println("总页数:"+ result.getTotalPages());
        List<Producter> content = result.getContent();
        System.err.print("数据:");
        content.forEach(System.err::print);
        System.out.println("");

        Aggregations aggregations = result.getAggregations();

        Terms terms = aggregations.get("brandAgg");
         terms.getBuckets().forEach(b->{
             System.out.println("品牌:"+b.getKeyAsString());
             System.out.println("count:"+b.getDocCount());
         });

    }

 

        高亮查询

                高亮查询的配置类,固定写法

import com.google.gson.Gson;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.core.SearchResultMapper;
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
import org.springframework.data.elasticsearch.core.aggregation.impl.AggregatedPageImpl;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

//SearchResultMapper 用来自定义查询结果的映射,将结果安装开发者配置,进行重组,然后再返回给客户端
//重写mapResults方法:配置自定义结果映射
public class ProductSearchResultMapper implements SearchResultMapper {
    @Override
    public <T> AggregatedPage<T> mapResults(SearchResponse searchResponse, Class<T> aClass, Pageable pageable) {
        //记录总数
        long totalHits = searchResponse.getHits().getTotalHits();
        //记录列表(泛型) ---构建Aggregate使用
        List<T> list =new ArrayList<>();
        //获取真正的记录
        SearchHits hits = searchResponse.getHits();
        SearchHit[] hs = hits.getHits();
        for (SearchHit h : hs) {

            Map<String, Object> map = h.getSourceAsMap();
            //获取需要高亮显示的字段
            Map<String, HighlightField> highlightFields = h.getHighlightFields();
            for(Map.Entry<String,HighlightField> hf :highlightFields.entrySet()){
                //一组高亮显示的字段
                String key = hf.getKey();
                HighlightField value = hf.getValue();
                //实际需要高亮显示的结果
                Text[] fragments = value.getFragments();
                //高亮的字段在key中
                map.put(key,fragments[0].toString());
            }
            //把Map转化为对象
            Gson gson = new Gson();
            T t = gson.fromJson(gson.toJson(map), aClass);
            list.add(t);
        }
          //返回带分页的结果
        AggregatedPageImpl<T> ts = new AggregatedPageImpl<>(list, pageable, totalHits);
        return ts;
    }
}

        高亮查询

 @Test//高亮查询
    public void naticeQuery1(){
        //创建原生查询构建器对象
        NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
        //过滤条件
        queryBuilder.withSourceFilter(new FetchSourceFilter(new String[]{"id","title","price"},new String[0]));
        //搜索条件
        queryBuilder.withQuery(QueryBuilders.matchQuery("title","荣耀"));
        //分页及排序条件      当前页起始数据的下标      每页的大小          排列的顺序
        queryBuilder.withPageable(PageRequest.of(0,2,Sort.by(Sort.Direction.DESC,"price")));
        //高亮显示
        //指定需要高亮显示的字段名称
        HighlightBuilder.Field field =new HighlightBuilder.Field("title");
//        field.preTags("<span style='color:yellow'>");//前缀
        field.preTags("<span id='highred'>");//前缀
        field.postTags("</span>");//后缀
        //将指定前缀和后缀的Field对象,绑定到queryBuilder对象上
        queryBuilder.withHighlightFields(field);



        //聚合      terms()方法指定分组的名称(聚合名称),field方法指定要按照哪一个字段进行分组
        queryBuilder.addAggregation(AggregationBuilders.terms("brandAgg").field("brand"));

        //构建查询条件,并且查询
        AggregatedPage<Producter> result = template.queryForPage(queryBuilder.build(), Producter.class,new ProductSearchResultMapper());

        //解析结果
        //分页结果
        System.out.println("总条数:"+result.getTotalElements());
        System.out.println("总页数:"+ result.getTotalPages());
        List<Producter> content = result.getContent();
        System.out.println("数据"+content);

    }

        高亮显示的字段可以将指定的字段添加标签,然后前端写样式来改变展示的样式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/725560.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【前端】ant-design-pro初体验

什么是Ant Design Pro Ant Design Pro 是一个企业级中后台前端/设计解决方案&#xff0c;它秉承 Ant Design 的设计价值观&#xff0c;致力于在设计规范和基础组件的基础上&#xff0c;继续向上构建&#xff0c;提炼出典型模板/业务组件/配套设计资源&#xff0c;进一步提高企…

第164天:应急响应-挖矿脚本检测指南威胁情报样本定性文件清除入口修复

知识点 #知识点 -网页篡改与后门攻击防范应对指南 主要需了解&#xff1a;异常特征&#xff0c;处置流程&#xff0c;分析报告等 主要需了解&#xff1a;日志存储&#xff0c;Webshell检测&#xff0c;分析思路等 掌握&#xff1a; 中间件日志存储&#xff0c;日志格式内容介绍…

如何给旧电脑安装Linux系统

目录 必要软件下载 下载ultraiso软件 下载linux系统 刻录光盘 U盘启动 必要软件下载 下载ultraiso软件 进入ultraiso官网&#xff0c;链接如下&#xff1a; 最新UltraISO官方免费下载 - UltraISO软碟通中文官方网站 下载linux系统 准备一个8G或者以上的U盘&#xff0c;…

微搭学习路线图,JavaScript入门

目录 1 学习路线1.1 HTML 语义和结构1.2 使用 CSS 布局和美化1.3 使用 JavaScript 开发交互1.4 小程序API1.5 云开发1.6 微搭 2 JavaScript入门2.1 变量2.2 注释2.3 运算符2.4 条件语句2.5 函数2.6 事件 3 示例总结 可多初学的问&#xff0c;微搭学习几个小时够么&#xff0c;几…

学习网页设计html学习总结

学习网页设计html学习总结篇一 转眼间&#xff0c;已到了期末&#xff0c;学习网页设计这门课程也要结束了&#xff0c;虽然时间有点短&#xff0c;但是学过这个几周以后我受益匪浅。 记得最初接触dreamweaver的时候&#xff0c;我很茫然&#xff0c;因为刚接触陌生的软件心里会…

4 springboot配置文件——yaml语法

4.1 yaml配置文件介绍 原先的配置文件是application.properties&#xff0c;但是官方不推荐使用这个&#xff0c;官方推荐使用application.yaml配置文件。因此&#xff0c;将原来的application.properties删除&#xff0c;改为application.yaml。 4.2 yaml配置文件语…

MinIO部署简单使用

前言 前面我们做了分布式文件存储系统FastDFS的部署应用&#xff0c;其安装还是比较繁琐的&#xff0c;而且实际生产的应用限制较大&#xff0c;下面&#xff0c;介绍一款开源的文件系统——MinIO&#xff0c;它是一种对象存储解决方案&#xff0c;提供与 Amazon Web Services…

【回溯算法Part04】| 93.复原IP地址、78.子集、90.子集||

目录 &#x1f388;LeetCode93.复原IP地址 &#x1f388;LeetCode78.子集 &#x1f388; LeetCode90.子集|| &#x1f388;LeetCode93.复原IP地址 链接&#xff1a;93.复原IP地址 有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能…

MKS SERVO4257D 闭环步进电机_系列12 STM32_CAN例程

第1部分 产品介绍 具备脉冲接口和RS485/CAN串行接口&#xff0c;支持MODBUS-RTU通讯协议&#xff0c;内置高效FOC矢量算法。 硬件开源&#xff01; 第2部分 相关资料下载 2.1 源代码下载 网盘&#xff1a; 08_例程-STM32系列(CAN) 第3部分 参数配置和注意事项 3.1 电机参…

iPhone 15系规格全面出炉,配置大换血看齐安卓旗舰

网上经常有声音说 iPhone 又不行了&#xff0c;产品竞争力不如安卓云云&#xff0c;事实上是这样的吗&#xff1f; 就拿最近 618 智能手机销售情况来看&#xff0c;苹果一家就以 562.8 万部成绩拿下了近一半市场&#xff0c;营收占比更是高达 67%。 来源&#xff1a;Techlnsig…

OpenCV读取一张8位无符号四通道图像并显示

#include <iostream> #include <opencv2/imgcodecs.hpp> #include <opencv2/opencv.hpp> #include

聊聊Compose跨平台与KMM

作者&#xff1a;黄林晴 有许多开发者可能还没有了解过Compose Multiplatform和KMM&#xff0c;那么本次分享将通过以下几点来介绍Compose Multiplatform 与KMM&#xff0c;让我们一起体验Kotlin跨平台的魅力。 Compose Multiplatform 与 KMM的关系Compose Multiplatform 与 K…

RK3588平台开发系列讲解(Camera篇)V4L2 主要特性

文章目录 一、V4L2 介绍1.1、模块化的架构1.2、统一的设备节点1.3、统一的视频数据格式1.4、支持多种视频设备1.5、支持流式 I/O1.6、支持控制参数1.7、支持事件通知二、V4L2使用场景沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇章主要讲解V4L2 主要特性。 一、…

赛宁数字孪生靶场:构建验证评估业务的新势能

​​2023年5月1日实施的《关键信息基础设施安全保护要求》中对于关基企业的现有网络安全保障体系提出了更加具体全面的要求&#xff0c;人员、系统、体系是检测评估主要关注的方向。 赛宁数字孪生靶场从验证评估业务的角度出发&#xff0c;借助多云融合能力、多样化仿真能力、…

链式编程艺术:探索 Promise 链的美妙之处

文章目录 1. 什么是 Promise&#xff1f;它解决了什么问题&#xff1f;2. Promise 有哪些状态&#xff0c;并且解释每个状态的含义。3. 如何创建一个 Promise&#xff0c;并描述其基本结构和用法。4. 解释 Promise 的链式调用&#xff08;chaining&#xff09;和方法的执行顺序…

RabbitMQ系列(13)--Direct交换机的简介与实现

1、Direct交换机的介绍 Direct交换机能让消息只发送往绑定了指定routingkey的队列中去&#xff0c;值得注意的是当绑定多个队列的routingkey都相同&#xff0c;则这种情况下的表现与Fanout交换机的类似 2、Direct交换机的实现 (1)新建一个名为fanout的包&#xff0c;用于装发…

QT6在线下载安装慢的问题

由于某“墙”的原因&#xff0c;在国内安装QT是会要了老命的&#xff0c;下载只有几十K&#xff0c;安装QT6保守估计得按天计算了。 经过多次尝试&#xff0c;终于找到了可以“几十MB”速度下载安装的办法。 方法一&#xff1a; qt-unified-windows-x64-4.5.2-online.exe --…

leetcode:移动零

移动零 easy 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0]示例 2: 输入: nums […

回归预测 | MATLAB实现BES-LSSVM秃鹰算法优化最小二乘支持向量机多输入单输出

回归预测 | MATLAB实现BES-LSSVM秃鹰算法优化最小二乘支持向量机多输入单输出 目录 回归预测 | MATLAB实现BES-LSSVM秃鹰算法优化最小二乘支持向量机多输入单输出预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现BES-LSSVM秃鹰算法优化最小二乘支持向量机多输入…

如何用深度强化学习自动炒股

初衷 最近一段时间&#xff0c;受到新冠疫情的影响&#xff0c;股市接连下跌&#xff0c;作为一棵小白菜兼小韭菜&#xff0c;竟然产生了抄底的大胆想法&#xff0c;拿出仅存的一点私房钱梭哈了一把。 第二天&#xff0c;暴跌&#xff0c;俺加仓 第三天&#xff0c;又跌&…