java 对ElasticSearch数据库操作封装工具类(对你是否适用嘞)

在 Java 中封装 ElasticSearch(ES)数据库操作(ES版本之间变动挺大的,别轻易换版本),可以使得与 ES 的交互更加简洁和易于维护。通过封装常见的操作,如插入文档、查询、更新和删除等,我们可以创建一个高效的工具类来简化开发流程。以下是一个简单的 ES 操作工具类的封装示例。

1. 添加 Elasticsearch 依赖

首先,确保在项目中添加了 Elasticsearch 的 Java 客户端依赖。以下是 Maven 依赖配置:

<dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.10.0</version> <!-- 请根据版本需求修改 -->
</dependency>

2. Elasticsearch 操作封装工具类

import org.apache.http.HttpHost;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.query.QuerySearchResult;
import org.elasticsearch.search.query.QuerySearchResponse;
import org.elasticsearch.search.query.SearchRequest;
import org.elasticsearch.search.query.SearchResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.search.SearchHit;import java.io.IOException;
import java.util.ArrayList;
import java.util.List;public class ElasticSearchUtil {private static final String ES_HOST = "localhost";  // ES 集群地址private static final int ES_PORT = 9200;           // 默认端口号private static RestHighLevelClient client;// 静态初始化:创建 Elasticsearch 客户端static {client = new RestHighLevelClient(RestClient.builder(new HttpHost(ES_HOST, ES_PORT, "http")));}// 获取 Elasticsearch 客户端public static RestHighLevelClient getClient() {return client;}// 关闭 Elasticsearch 客户端连接public static void close() throws IOException {if (client != null) {client.close();}}// 插入文档public static void indexDocument(String index, String id, String jsonData) {IndexRequest request = new IndexRequest(index).id(id).source(jsonData);try {client.index(request, RequestOptions.DEFAULT);System.out.println("Document indexed successfully.");} catch (IOException e) {System.err.println("Failed to index document: " + e.getMessage());}}// 更新文档public static void updateDocument(String index, String id, String jsonData) {UpdateRequest request = new UpdateRequest(index, id).doc(jsonData);try {client.update(request, RequestOptions.DEFAULT);System.out.println("Document updated successfully.");} catch (IOException e) {System.err.println("Failed to update document: " + e.getMessage());}}// 查询文档public static List<String> searchDocuments(String index, String field, String value) {SearchRequest searchRequest = new SearchRequest(index);SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();sourceBuilder.query(QueryBuilders.matchQuery(field, value));searchRequest.source(sourceBuilder);List<String> results = new ArrayList<>();try {SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);SearchHit[] hits = searchResponse.getHits().getHits();for (SearchHit hit : hits) {results.add(hit.getSourceAsString());}} catch (IOException e) {System.err.println("Failed to search documents: " + e.getMessage());}return results;}// 删除文档public static void deleteDocument(String index, String id) {try {client.delete(new DeleteRequest(index, id), RequestOptions.DEFAULT);System.out.println("Document deleted successfully.");} catch (IOException e) {System.err.println("Failed to delete document: " + e.getMessage());}}public static void main(String[] args) throws IOException {// 插入文档示例String jsonData = "{\"name\":\"John\",\"age\":30}";indexDocument("users", "1", jsonData);// 查询文档示例List<String> documents = searchDocuments("users", "name", "John");for (String doc : documents) {System.out.println(doc);}// 更新文档示例String updatedData = "{\"name\":\"John\",\"age\":31}";updateDocument("users", "1", updatedData);// 删除文档示例deleteDocument("users", "1");// 关闭 Elasticsearch 客户端close();}
}

3. 功能说明

1. 客户端初始化与关闭
  • RestHighLevelClient 用于与 Elasticsearch 进行交互。
  • client = new RestHighLevelClient(...):初始化客户端连接。
  • client.close():关闭客户端连接,释放资源。
2. 插入文档
public static void indexDocument(String index, String id, String jsonData) {IndexRequest request = new IndexRequest(index).id(id).source(jsonData);try {client.index(request, RequestOptions.DEFAULT);System.out.println("Document indexed successfully.");} catch (IOException e) {System.err.println("Failed to index document: " + e.getMessage());}
}
  • IndexRequest 用于向指定索引中插入文档。
  • source(jsonData):文档内容以 JSON 格式传入。
3. 更新文档
public static void updateDocument(String index, String id, String jsonData) {UpdateRequest request = new UpdateRequest(index, id).doc(jsonData);try {client.update(request, RequestOptions.DEFAULT);System.out.println("Document updated successfully.");} catch (IOException e) {System.err.println("Failed to update document: " + e.getMessage());}
}
  • UpdateRequest 用于更新指定 ID 的文档。
4. 查询文档
public static List<String> searchDocuments(String index, String field, String value) {SearchRequest searchRequest = new SearchRequest(index);SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();sourceBuilder.query(QueryBuilders.matchQuery(field, value));searchRequest.source(sourceBuilder);List<String> results = new ArrayList<>();try {SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);SearchHit[] hits = searchResponse.getHits().getHits();for (SearchHit hit : hits) {results.add(hit.getSourceAsString());}} catch (IOException e) {System.err.println("Failed to search documents: " + e.getMessage());}return results;
}
  • SearchRequestSearchSourceBuilder 用于构建查询请求。
  • QueryBuilders.matchQuery() 用于构建匹配查询。
5. 删除文档
public static void deleteDocument(String index, String id) {try {client.delete(new DeleteRequest(index, id), RequestOptions.DEFAULT);System.out.println("Document deleted successfully.");} catch (IOException e) {System.err.println("Failed to delete document: " + e.getMessage());}
}
  • DeleteRequest 用于删除指定 ID 的文档。

4. 如何使用该工具类

  • 插入文档:使用 indexDocument() 方法,将 JSON 数据插入指定的 Elasticsearch 索引中。
  • 更新文档:使用 updateDocument() 方法更新指定 ID 的文档。
  • 查询文档:使用 searchDocuments() 方法,根据字段值进行查询。
  • 删除文档:使用 deleteDocument() 方法删除指定 ID 的文档。

5. 改进与扩展

  • 分页查询:可以扩展查询功能,支持分页,避免返回过多数据。
  • 错误处理:根据实际需要加强错误处理逻辑,捕获并处理可能的异常。
  • 连接池支持:为了提高性能,建议使用连接池来管理 Elasticsearch 客户端。

通过这样的封装工具类,你可以轻松地执行 Elasticsearch 的常见操作,而不需要每次都编写繁琐的客户端代码。

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

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

相关文章

专题八:背包问题

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解什么是记忆化搜索&#xff0c;并且掌握记忆化搜索算法。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持。早…

SpringBoot核心:自动配置

有使用过SSM框架的&#xff0c;还记得曾经在spring-mybatis.xml配置了多少内容吗&#xff1f;数据源、连接池、会话工厂、事务管理&#xff0c;而现在Spring Boot告诉你这些都不需要了&#xff0c;简单的几个注解统统搞定&#xff0c;是不是很方便&#xff01; 前言 SpringBoo…

python 定时任务管理封装

主逻辑代码 # -*- coding: utf-8 -*- # import apscheduler import pandas as pd from datetime import datetime # 导入调度器&#xff0c;此处使用BackgroundScheduler阻塞调度器 from apscheduler.schedulers.background import BackgroundScheduler # 导入触发器&#xf…

APP投放的归因框架设计

一、归因相关概念回顾 在广告归因简介中我们介绍常见的归因模型和归因方法&#xff0c;我们先来回顾一下&#xff1a; 1. 背景 2. 设备标识 3. 归因模型 归因模型的多样性意味着每种模型都有其独特的优势和局限。关键在于选择一个与您的业务场景相匹配的模型&#xff0c;并且…

Kunlun 2280服务器(ARM)Raid卡磁盘盘符漂移问题解决

一、问题描述 1、服务器:Kunlun 2280服务器 ARM 2、操作系统:Euler2.0Sp10 Arm 3、Raid卡型号:MeGaRAID 9560-8i 4、Raid配置:2块配置Raid1作为系统盘&#xff0c;剩余磁盘配置Raid5 作为数据盘 二、问题现象 1、使用IBMC页面配置Raid卡&#xff0c;1个Raid1 系统盘和1个Raid5数…

[搜广推]王树森推荐系统——Deep Retrieval 召回

Deep Retrieval 简介 Deep Retrieval 是一种推荐系统框架&#xff0c;它将物品表示为路径&#xff08;path&#xff09;&#xff0c;并在线上查找与用户最匹配的路径。 这种方法与传统的双塔模型不同&#xff0c;后者通常将用户和物品表示为向量&#xff0c;并在线上进行最近邻…

RabbitMQ 的7种工作模式

RabbitMQ 共提供了7种⼯作模式,进⾏消息传递,. 官⽅⽂档:RabbitMQ Tutorials | RabbitMQ 1.Simple(简单模式) P:⽣产者,也就是要发送消息的程序 C:消费者,消息的接收者 Queue:消息队列,图中⻩⾊背景部分.类似⼀个邮箱,可以缓存消息;⽣产者向其中投递消息,消费者从其中取出消息…

PCIe_Host驱动分析_设备枚举

往期内容 本文章相关专栏往期内容&#xff0c;PCI/PCIe子系统专栏&#xff1a; 嵌入式系统的内存访问和总线通信机制解析、PCI/PCIe引入 深入解析非桥PCI设备的访问和配置方法 PCI桥设备的访问方法、软件角度讲解PCIe设备的硬件结构 深入解析PCIe设备事务层与配置过程 PCIe的三…

深入浅出:多功能 Copilot 智能助手如何借助 LLM 实现精准意图识别

阅读原文 1. Copilot中的意图识别 如果要搭建一个 Copilot 智能助手&#xff0c;比如支持 知识问答、数据分析、智能托管、AIGC 等众多场景或能力&#xff0c;那么最核心的就是基于LLM进行意图识别分发能力&#xff0c;意图识别的准确率直接决定了 Copilot 智能助手的能力上限…

Jo-im开发:用于WebRTC的ICE中继服务器Coturn搭建

前言 本人计划开发一套具备文本、语音、视频通话功能的IM demo&#xff0c;同时具备多人在线会议功能&#xff0c;按习惯大概会开源版定义名称为Duihao jo-im&#xff0c;本案主要用于实现语音视频通话的基础组件支撑。因为我们选择基于WebRTC实现IM中语音、视频通话&#xff…

【CVE-2024-53375】TP-Link Archer系列路由器认证操作系统命令注入(内附远离和代码利用)

CVE-2024-53375 TP-Link Archer系列路由器认证操作系统命令注入 受影响的设备 使用 HomeShield 功能的 TP-Link 设备容易受到此漏洞的影响。这包括 TP-Link Archer 系列的多款路由器。 经过测试 Archer AXE75(EU)_V1_1.2.2 Build 20240827(发布日期 2024 年 11 月 4 日)…

程控电阻箱应用中需要注意哪些安全事项?

程控电阻箱是一种用于精确控制电路中电流和电压的电子元件&#xff0c;广泛应用于电子实验、测试设备以及精密测量仪器中。在应用程控电阻箱时&#xff0c;为确保安全和设备的正常运行&#xff0c;需要注意以下几个安全事项&#xff1a; 1. 正确连接&#xff1a;确保电阻箱与电…

Promise链式调用

Promise链式调用 上一篇我们实现了通过promise的方式实现获取国家基本信息&#xff0c;本次我们来使用promise链式调用来实现邻国的展现 首先&#xff0c;我们从第一个国家中获取到邻国的国家代码名称 const neighbour data[0].borders[0];然后我们通过fetch来获取邻国信息&a…

Elasticsearch相关知识@1

目录标题 Lucene1. **什么是 Lucene?**2. **Lucene 在 Elasticsearch 中的作用**3. **Lucene 的核心功能**(1) **倒排索引**(2) **分词**(3) **查询解析**(4) **相关性评分** 4. **为什么 Elasticsearch 使用 Lucene?**5. **Lucene 和 Elasticsearch 的区别**6. **总结** 分片…

UE5 渲染管线 学习笔记

兰伯特 SSS为散射的意思 带Bias的可以根据距离自动切换mip的卷积值 而带Level的值mipmaps的定值 #define A8_SAMPLE_MASK .a 这样应该就很好理解了 这个只采样a通道 带Level的参考上面的 朝左上和右下进行模糊 带Bias参考上面

canvas绘制仪表盘刻度盘

canvas画布可以实现在网页上绘制图形的方法&#xff0c;比如图表、图片处理、动画、游戏等。今天我们在vue模板下用canvas实现仪表盘的绘制。 对canvas不熟悉的同学可以先了解下canvas的API文档&#xff1a;canvas API中文网 - Canvas API中文文档首页地图 一、创建模板&#…

Spring Boot 中实现自定义注解记录接口日志功能

&#x1f468;&#x1f3fb;‍&#x1f4bb; 热爱摄影的程序员 &#x1f468;&#x1f3fb;‍&#x1f3a8; 喜欢编码的设计师 &#x1f9d5;&#x1f3fb; 擅长设计的剪辑师 &#x1f9d1;&#x1f3fb;‍&#x1f3eb; 一位高冷无情的全栈工程师 欢迎分享 / 收藏 / 赞 / 在看…

【超详细实操内容】django的身份验证系统之限制用户访问的三种方式

目录 1、使用request.user.is_authenticated属性 2、装饰器login_required 3、LoginRequiredMixin类 通常情况下,网站都会对用户限制访问,例如,未登录的用户不可访问用户中心页面。Django框架中使用request.user.isauthenticated属性、装饰器loginrequired和LoginRequire…

scss配置全局变量报错[sass] Can‘t find stylesheet to import.

路径没有错误&#xff0c;使用别名即可 后又提示Deprecation Warning: Sass import rules are deprecated and will be removed in Dart Sass 3.0.0. 将import改为use 使用时在$前添加全局变量所在文件&#xff0c;即variable.

基于Qlearning强化学习的机器人路线规划matlab仿真

目录 1.算法仿真效果 2.算法涉及理论知识概要 3.MATLAB核心程序 4.完整算法代码文件获得 1.算法仿真效果 matlab2022a仿真结果如下&#xff08;完整代码运行后无水印&#xff09;&#xff1a; 训练过程 测试结果 仿真操作步骤可参考程序配套的操作视频。 2.算法涉及理论…