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

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

1. 添加 Elasticsearch 依赖

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

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

2. Elasticsearch 操作封装工具类

java 复制代码
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. 插入文档
java 复制代码
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. 更新文档
java 复制代码
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. 查询文档
java 复制代码
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. 删除文档
java 复制代码
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 的常见操作,而不需要每次都编写繁琐的客户端代码。

相关推荐
zzb15806 小时前
RAG from Scratch-优化-query
java·数据库·人工智能·后端·spring·mybatis
一只鹿鹿鹿6 小时前
信息安全等级保护安全建设防护解决方案(总体资料)
运维·开发语言·数据库·面试·职场和发展
堕2746 小时前
MySQL数据库《基础篇--数据库索引(2)》
数据库·mysql
wei_shuo6 小时前
数据库优化器进化论:金仓如何用智能下推把查询时间从秒级打到毫秒级
数据库·kingbase·金仓
wuqingshun3141596 小时前
如何停止一个正在退出的线程
java·开发语言·jvm
雷工笔记6 小时前
Navicat Premium 17 软件安装记录
数据库
wenlonglanying7 小时前
Ubuntu 系统下安装 Nginx
数据库·nginx·ubuntu
数据库小组7 小时前
10 分钟搞定!Docker 一键部署 NineData 社区版
数据库·docker·容器·database·数据库管理工具·ninedata·迁移工具
Barkamin7 小时前
队列的实现(Java)
java·开发语言
爬山算法7 小时前
MongoDB(38)如何使用聚合进行投影?
数据库·mongodb