封装ES高亮Yxh-Es

拉取代码

git拉取 yxh-elasticsearch: es基本封装工具

使用场景

我们拿游览器举例,我将我要搜索的内容输入到输入框进行搜索,游览器就会根据对应的内容查出文章中出现过的关键字,并加上样式,让我们看的更清晰。

我们以就是使用全文检索的时候,好比用户输入关键字,es进行查询,给用户呈现的页面对应的内容,以及将用户输入的关键字,加粗或标识出来。

获取泛型

/**
 * 获取泛型
 */
private Class<T> deSerializable() {
    Type type = getClass().getGenericSuperclass();
    if (type instanceof ParameterizedType) {
        ParameterizedType parameterizedType = (ParameterizedType) type;
        System.out.println(parameterizedType.getActualTypeArguments()[0]);
        return (Class<T>) parameterizedType.getActualTypeArguments()[0];
    }
    throw new RuntimeException();
}

接口

接口需要加上泛型

核心代码

高亮查询

这块代码主要就是实现一个查询出高亮字段,通过读取注解里的参数,做对应的替换。

/**
 * 高亮查询
 * @param request 参数
 * @param data 泛型
 * @param indexName 索引名
 * @param client 连接
 * */
public List<Object> queryHighLight(String request, Class<?> data, String indexName, RestHighLevelClient client) throws IllegalAccessException {
    List<Object> list = new ArrayList<>();
    //获取list的泛型
    HighLightDTO highLightDTO = readHighLight(data);
    try {
        //创建请求索引
        SearchRequest searchRequest = new SearchRequest(indexName);
        //创建构造器
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        //创建条件拼接
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        //查询用户名 模糊查询
        if (null != request){
            boolQueryBuilder.must(QueryBuilders.wildcardQuery(highLightDTO.getName(),"*"+request+"*"));
        }
        //条件存放构造器
        searchSourceBuilder.query(boolQueryBuilder);
        //高亮
        searchSourceBuilder.highlighter(new HighlightBuilder().field(highLightDTO.getName()).preTags(highLightDTO.getPreTag()).postTags(highLightDTO.getPostTag()));
        searchRequest.source(searchSourceBuilder);
        SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);
        SearchHits hits = search.getHits();
        for (SearchHit hit : hits.getHits()) {
            String sourceAsString = hit.getSourceAsString();
            Object object = JSONObject.parseObject(sourceAsString, data);
            //获取高亮集合
            Map<String, HighlightField> highlightFields = hit.getHighlightFields();
            if (null!=highlightFields){
                HighlightField obj = highlightFields.get(highLightDTO.getName());
                if (null != obj){
                    String str = "";
                    for (Text fragment : obj.getFragments()) {
                        str += fragment;
                    }
                    //将字段赋值
                    assignment(object, highLightDTO.getMapping(), str);
                }
            }
            //将存储的结果存入list集合
            list.add(object);
        }
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
    return list;
}

标记映射

主要起到,读取@HighLight该注解所映射的字段。

/**
 * 读取@HighLight映射字段
 * */
private HighLightDTO readHighLight(Class<?> data) throws IllegalAccessException {
    Field[] fields = data.getDeclaredFields();
    String name = null;
    String preTags = null;
    String postTags = null;
    String mapping = null;
    for (Field field : fields) {
        HighLight annotation = field.getAnnotation(HighLight.class);//映射@highLight值
        if (annotation!=null){
            field.setAccessible(true);
            name = field.getName();//字段名
            preTags = annotation.preTag();//自定义标签前缀
            postTags = annotation.postTag();//自定义标签后缀
            mapping = annotation.mappingField();//映射字段
        }
    }
    return new HighLightDTO(name,preTags,postTags,mapping);
}


/**
 * 给高亮值赋值
 */
private void assignment(Object data, String fieldName, String newValue) throws IllegalAccessException, NoSuchFieldException {
    Field field = data.getClass().getDeclaredField(fieldName);
    field.setAccessible(true);
    field.set(data, convertValue(field.getType(), newValue));
}


/**
 * 转类型
 */
private Object convertValue(Class<?> fieldType, String value) {
    JdkDataTypeEnum byType = JdkDataTypeEnum.getByType(String.valueOf(fieldType));
    switch (byType){
        case INTEGER:
            return Integer.parseInt(value);
        case LONG:
            return Long.parseLong(value);
        case BOOLEAN:
            return Boolean.parseBoolean(value);
        default:
            return value;
    }
}

总结

这次我是将原先的yxh-es做了一个迭代,一开始没有查询方法,也没有高亮,当时这个高亮灵感是来自于easy-es,因为之前在使用这个工具的时候,发现他们团的做的少了个高亮查询,我测了好几次,让身边的同事也测了,发现不行,就是有问题的,想着就自己封装es,把这个高亮也补上。当然我这个高亮目前仅限于一个字段来模糊查,我后门会在对该工具迭代更新。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

布谷语音源码服务器搭建环境及配置流程

布谷语音源码部署环境安装要求&#xff08;只有在相同的环境下才更容易避免一些不必要的麻烦&#xff09;&#xff1a;●安装Center OS 7.9&#xff0c;我们自己的服务器使用的是7.9建议相同系统&#xff0c;非强制●安装宝塔环境&#xff08;强烈推荐使用&#xff09;●安装软…

百度SEO中的关键词密度与内容优化研究【百度SEO专家】

大家好&#xff0c;我是百度SEO专家&#xff08;林汉文&#xff09;&#xff0c;在百度SEO优化中&#xff0c;关键词密度和关键词内容的优化对提升页面排名至关重要。关键词的合理布局与内容的质量是确保网页在百度搜索结果中脱颖而出的关键因素。下面我们将从关键词密度和关键…

RDKit|分子数据的聚类分析

分子数据的聚类分析 聚类分析是一种无监督学习技术,用于根据分子特征将分子分组成若干簇。每个簇中的分子在特征空间中应当相似,而不同簇之间的分子差异则较大。在化学信息学和药物设计中,聚类分析常用于化合物库的分组、潜在药物靶点的发现以及分子多样性分析。 1 聚类分…

k8s环境下rabbitmq安装社区插件:rabbitmq_delayed_message_exchange

怎么在k8s环境下的rabbitmq安装社区版插件:rabbitmq_delayed_message_exchange 在你的rabbit-value.yaml中加入以下行&#xff0c;然后使用helm重新安装&#xff08;最好把pvc也删了重新安装&#xff08;如果你的密码变化了的话&#xff09; 减少出错概率&#xff09; ## par…

【python】OpenCV—findContours(4.4)

文章目录 1、功能描述2、代码实现3、完整代码4、结果展示5、涉及到的库函数6、参考 1、功能描述 找出物体轮廓&#xff0c;根据 PCA 计算特征值和特征向量&#xff0c;绘制特征值和特征向量&#xff0c;来初步展示物体的方向 2、代码实现 导入库函数&#xff0c;读入图片&am…

【论文阅读笔记】VLP: A Survey on Vision-language Pre-training

目录 前言2 特征提取&#xff08;Feature extraction&#xff09;2.1.1 图象特征提取OD-based Region feature / RoIFreeze the pre-trained object detectorsGrid features&#xff08;网格特征&#xff09;CNN-GFsEnd-to-End Training&#xff08;端到端训练&#xff09;ViT-…

Swarm-LIO: Decentralized Swarm LiDAR-inertial Odometry论文翻译

文章目录 前言一、介绍二、相关工作三、方法A. 问题表述B. 框架概述C. 群体系统的初始化D. 去中心化激光雷达-惯性状态估计 四. 实验A. 室内飞行B. 退化环境飞行C. 去中心化部署 五. 结论和未来工作 前言 原文&#xff1a;原文 准确的自我状态和相对状态估计是完成群体任务的关…

Apache Hive分布式容错数据仓库系统

Apache Hive™是一个分布式的、容错的数据仓库系统&#xff0c;它支持大规模的分析&#xff0c;并使用SQL方便地读取、写入和管理驻留在分布式存储中的pb级数据。 Apache Hive Apache Hive是什么 Apache Hive是一个分布式的、容错的数据仓库系统&#xff0c;支持大规模的分析…

Vue CLI: 安装、项目创建及基本概念指南,vue生命周期

只有经历地狱般的磨砺&#xff0c;才能练就创造出天堂的力量&#xff1b;只有流过血的手指&#xff0c;才能弹奏出世间绝唱 文章目录 vue-cli介绍安装创建项目入口文件修改文件夹名称的步骤ES6模块化单文件组件 vue生命周期vue动画 vue-cli 介绍 vue-lic是一个开发vue项目的脚…

Geotrust SSL证书

在数字化浪潮席卷全球的今天&#xff0c;互联网已成为信息交流与商业活动不可或缺的平台。然而&#xff0c;随着网络应用的深入&#xff0c;数据泄露、身份盗用、网络诈骗等安全问题也日益凸显&#xff0c;严重威胁着用户的隐私与财产安全。在这样的背景下&#xff0c;数字证书…

css实现边框双色凹凸半圆

整体效果如下图&#xff1a; 结构代码&#xff1a; <div classline-outside-wrap><div classwrap><img src../img/avatar2x.png/><div classcontent-wrap></div></div></div> 内凹框实现&#xff1a; .content-wrap{width:100%;he…

HarmonyOS:自定义组件冻结功能

一、简介 自定义组件冻结功能专为优化复杂UI页面的性能而设计&#xff0c;尤其适用于包含多个页面栈、长列表或宫格布局的场景。在这些情况下&#xff0c;当状态变量绑定了多个UI组件&#xff0c;其变化可能触发大量UI组件的刷新&#xff0c;进而导致界面卡顿和响应延迟。为了提…

Kafka相关API开发

(一)引入依赖 用API直接去操作kafka(读写数据)在实际开发中用的并不多&#xff0c;学习它主要还是为了加深对Kafka功能的理解。kafka的读写操作&#xff0c;实际开发中&#xff0c;是通过各类更上层的组件去实现。而这些组件在读写kafka数据时&#xff0c;用的当然是kafka的jav…

警务辅助人员管理系统小程序ssm+论文源码调试讲解

2系统关键技术 2.1 微信小程序 微信小程序&#xff0c;简称小程序&#xff0c;英文名Mini Program&#xff0c;是一种全新的连接用户与服务的方式&#xff0c;可以快速访问、快速传播&#xff0c;并具有良好的使用体验。 小程序的主要开发语言是JavaScript&#xff0c;它与普…

微服务设计模式 - 断路器模式 (Circuit Breaker Pattern)

微服务设计模式 - 断路器模式 (Circuit Breaker Pattern) 定义 断路器模式&#xff08;Circuit Breaker Pattern&#xff09;是云计算和微服务架构中的一种保护性设计模式&#xff0c;其目的是避免系统中的调用链出现故障时&#xff0c;导致系统瘫痪。通过断路器模式&#xff…

Yelp 数据集进行用户画像, 使用聚类做推荐

使用 Yelp 数据集进行用户画像&#xff08;User Profiling&#xff09;是一项有趣的任务&#xff0c;可以理解用户的偏好、行为和特征。以下是总结的一个基本的步骤&#xff0c;帮助构建用户画像 pandas 加载数据&#xff1a; import pandas as pd# 加载数据 users pd.read_…

DDRPHY数字IC后端设计实现系列专题之后端设计导入,IO Ring设计

本章详细分析和论述了 LPDDR3 物理层接口模块的布图和布局规划的设计和实 现过程&#xff0c;包括设计环境的建立&#xff0c;布图规划包括模块尺寸的确定&#xff0c;IO 单元、宏单元以及 特殊单元的摆放。由于布图规划中的电源规划环节较为重要&#xff0c; 影响芯片的布线资…

前端路由如何从0开始配置?vue-router 的使用

在 Web 开发中&#xff0c;路由是指根据 URL 的不同部分将请求分发到不同的处理函数或页面的过程。路由是单页应用&#xff08;SPA, Single Page Application&#xff09;和服务器端渲染&#xff08;SSR, Server-Side Rendering&#xff09;应用中的一个重要概念。 在开发中如何…

强化学习的数学原理-06随即近似理论和随机梯度下降

文章目录 Robbins-Monro algorithmStochastic gradient descentBGD、MBGD、 and SGDSummary Robbins-Monro algorithm 迭代式求平均数的算法 S t o c h a s t i c a p p r o x i m a t i o n ( S A ) Stochastic \; approximation \;(SA) Stochasticapproximation(SA)&#xf…

Apache Hive 通过Docker快速入门

QuickStarted 介绍 在伪分布式模式下在 docker 容器内运行 Apache Hive&#xff0c;以便为 Hive 提供以下快速启动/调试/准备测试环境 快速入门 步骤 1&#xff1a;拉取镜像 从 DockerHub 拉取镜像&#xff1a;https://hub.docker.com/r/apache/hive/tags。以下是最新的镜像…