使用java代码提供一个全面的根据泛型返回的ElasticSearch查询工具类

时间: 2024-02-09 14:12:29 浏览: 29
好的,以下是一个全面的根据泛型返回的 Elasticsearch 查询工具类的代码示例: ```java import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.builder.SearchSourceBuilder; import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder; import org.elasticsearch.search.fetch.subphase.highlight.HighlightField; import java.io.IOException; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class ElasticsearchUtils<T> { private final RestHighLevelClient client; public ElasticsearchUtils(RestHighLevelClient client) { this.client = client; } /** * 根据关键词查询ES中的数据 * * @param indexName 索引名称 * @param keyword 查询关键词 * @param clazz 查询结果类型 * @param size 返回结果数量 * @return 返回查询结果列表 */ public List<T> searchByKeyword(String indexName, String keyword, Class<T> clazz, int size) throws IOException { List<T> resultList = new ArrayList<>(); // 创建查询请求 SearchRequest searchRequest = new SearchRequest(indexName); // 构建查询条件 SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.query(QueryBuilders.matchQuery("content", keyword)); searchSourceBuilder.timeout(TimeValue.timeValueSeconds(60)); searchSourceBuilder.size(size); // 构建高亮显示 HighlightBuilder highlightBuilder = new HighlightBuilder(); highlightBuilder.field("content"); highlightBuilder.requireFieldMatch(false); highlightBuilder.preTags("<span style=\"color:red\">"); highlightBuilder.postTags("</span>"); searchSourceBuilder.highlighter(highlightBuilder); searchRequest.source(searchSourceBuilder); // 执行查询 SearchResponse searchResponse = client.search(searchRequest); // 解析查询结果 SearchHit[] searchHits = searchResponse.getHits().getHits(); for (SearchHit hit : searchHits) { T obj = parseHitSource(hit.getSourceAsMap(), clazz); // 解析高亮显示 Map<String, HighlightField> highlightFields = hit.getHighlightFields(); for (Map.Entry<String, HighlightField> entry : highlightFields.entrySet()) { String fieldName = entry.getKey(); HighlightField highlightField = entry.getValue(); if (highlightField != null) { Field field = getField(clazz, fieldName); if (field != null) { setFieldValue(obj, field, highlightField.fragments()[0].toString()); } } } resultList.add(obj); } return resultList; } /** * 解析查询结果中的hit源数据,并转换为指定类型的对象 * * @param sourceMap hit源数据 * @param clazz 目标类型 * @return 返回转换后的对象 */ private T parseHitSource(Map<String, Object> sourceMap, Class<T> clazz) { Map<String, Object> resultMap = new HashMap<>(); // 将Map中的key转换为小写,避免与Java类中的字段出现不匹配 for (Map.Entry<String, Object> entry : sourceMap.entrySet()) { resultMap.put(entry.getKey().toLowerCase(), entry.getValue()); } return JsonUtils.fromJson(JsonUtils.toJson(resultMap), clazz); } /** * 获取Java类中指定名称的字段 * * @param clazz Java类 * @param fieldName 字段名称 * @return 返回字段对象 */ private Field getField(Class<?> clazz, String fieldName) { Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { if (field.getName().equalsIgnoreCase(fieldName)) { field.setAccessible(true); return field; } } return null; } /** * 设置Java对象中指定字段的值 * * @param obj Java对象 * @param field 字段对象 * @param value 字段值 */ private void setFieldValue(T obj, Field field, String value) { try { if (field.getType() == String.class) { field.set(obj, value); } else if (field.getType() == Integer.class || field.getType() == int.class) { field.set(obj, Integer.parseInt(value)); } else if (field.getType() == Long.class || field.getType() == long.class) { field.set(obj, Long.parseLong(value)); } else if (field.getType() == Double.class || field.getType() == double.class) { field.set(obj, Double.parseDouble(value)); } else if (field.getType() == Float.class || field.getType() == float.class) { field.set(obj, Float.parseFloat(value)); } else if (field.getType() == Boolean.class || field.getType() == boolean.class) { field.set(obj, Boolean.parseBoolean(value)); } } catch (IllegalAccessException e) { e.printStackTrace(); } } } ``` 这个工具类的主要作用是根据关键词查询 Elasticsearch 中的数据,并返回查询结果列表。其中,使用了 Elasticsearch 的 Java 客户端 RestHighLevelClient,以及构建查询条件的 SearchSourceBuilder。查询条件中使用了 matchQuery 方法,可以通过关键词查询指定字段(这里是 content 字段)的匹配结果。同时,还使用了 HighlightBuilder 对结果中匹配的内容进行高亮显示。在解析查询结果时,使用了反射机制将 Elasticsearch 中的 hit 源数据转换为指定类型的 Java 对象,并在解析高亮显示时,使用反射机制设置 Java 对象中指定字段的值。

相关推荐

最新推荐

recommend-type

Java使用反射来获取泛型信息示例

主要介绍了Java使用反射来获取泛型信息,结合实例形式分析了java基于反射操作泛型信息的相关实现技巧与注意事项,需要的朋友可以参考下
recommend-type

Java泛型的用法及T.class的获取过程解析

主要介绍了Java泛型的用法及T.class的获取过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
recommend-type

Java 获取泛型的类型实例详解

主要介绍了Java 获取泛型的类型实现代码的相关资料,需要的朋友可以参考下
recommend-type

C#读取数据库返回泛型集合详解(DataSetToList)

本篇文章主要是对C#读取数据库返回泛型集合(DataSetToList)进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助
recommend-type

Java swing + socket + mysql 五子棋网络对战游戏FiveChess.zip

五子棋游戏想必大家都非常熟悉,游戏规则十分简单。游戏开始后,玩家在游戏设置中选择人机对战,则系统执黑棋,玩家自己执白棋。双方轮流下一棋,先将横、竖或斜线的5个或5个以上同色棋子连成不间断的一排者为胜。 【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。 【技术】 Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

用 Python 画一个可以动的爱心

好的,我可以帮助您使用Python来绘制一个动态的爱心。您可以使用turtle库来实现。以下是实现代码: ```python import turtle import math # 设置画布和画笔 canvas = turtle.Screen() canvas.bgcolor("black") pencil = turtle.Turtle() pencil.speed(0) pencil.color("red", "pink") pencil.pensize(3) # 定义爱心函数 def draw_love(heart_size, x_offset=0, y_offset=0):
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。