编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

Spring Boot Data Elasticsearch 通用工具类

wxchong 2024-12-14 15:37:12 开源技术 16 ℃ 0 评论

Spring Boot Data Elasticsearch是Spring Boot框架中集成Elasticsearch搜索引擎的模块,它提供了许多便利的功能来简化与Elasticsearch的交互。在使用Spring Boot Data Elasticsearch时,我们可以使用一些通用的工具类来简化代码的编写和增强代码的可读性。

下面是一些常用的Spring Boot Data Elasticsearch通用工具类:

1、ElasticsearchTemplate

ElasticsearchTemplate是Spring Data Elasticsearch提供的一个基本的Elasticsearch操作模板,它封装了大部分Elasticsearch操作方法,包括增删改查等,使用起来非常方便。

2、ElasticsearchRestTemplate

ElasticsearchRestTemplate是基于Elasticsearch高级REST客户端API的操作模板,它提供了更加丰富的功能,例如:支持异步执行、请求拦截、响应拦截等。

3、ElasticsearchRepository

ElasticsearchRepository是Spring Data Elasticsearch提供的一个基本的CRUD接口,它封装了基本的增删改查等操作方法,我们只需要继承这个接口,就可以使用其中的方法来进行操作。

4、ElasticsearchRestHighLevelClient

ElasticsearchRestHighLevelClient是Elasticsearch官方提供的一个Java高级REST客户端,它提供了更加丰富的功能和更好的性能,可以用来替代ElasticsearchTemplate和ElasticsearchRestTemplate。

5、ElasticsearchConverter

ElasticsearchConverter是Spring Data Elasticsearch提供的一个接口,用于将Java对象和Elasticsearch文档进行转换。我们可以自定义实现该接口,以便支持自定义的对象和文档转换规则。

下面是一个 Spring Boot Data Elasticsearch 的通用工具类,实现了常用的索引的增删改查操作:

import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.IOException;

@Component
public class ElasticsearchUtil {

    @Autowired
    private RestHighLevelClient restHighLevelClient;

    /**
     * 新增或更新索引文档
     * @param index 索引名
     * @param id 文档ID
     * @param source 文档内容
     * @return 是否成功
     */
    public boolean saveOrUpdate(String index, String id, String source) throws IOException {
        IndexResponse response = restHighLevelClient.prepareIndex(index, "_doc", id)
                .setSource(source, XContentType.JSON)
                .get();
        return response.status().getStatus() == 201;
    }

    /**
     * 新增或更新索引文档
     * @param index 索引名
     * @param id 文档ID
     * @param source 文档内容
     * @return 是否成功
     */
    public boolean saveOrUpdate(String index, String id, XContentBuilder source) throws IOException {
        IndexResponse response = restHighLevelClient.prepareIndex(index, "_doc", id)
                .setSource(source)
                .get();
        return response.status().getStatus() == 201;
    }

    /**
     * 根据ID获取索引文档
     * @param index 索引名
     * @param id 文档ID
     * @return 文档内容
     */
    public String getById(String index, String id) throws IOException {
        GetResponse response = restHighLevelClient.prepareGet(index, "_doc", id)
                .get();
        return response.getSourceAsString();
    }

    /**
     * 根据ID删除索引文档
     * @param index 索引名
     * @param id 文档ID
     * @return 是否成功
     */
    public boolean deleteById(String index, String id) throws IOException {
        DeleteResponse response = restHighLevelClient.prepareDelete(index, "_doc", id)
                .get();
        return response.status().getStatus() == 200;
    }

    /**
     * 更新索引文档
     * @param index 索引名
     * @param id 文档ID
     * @param source 新的文档内容
     * @return 是否成功
     */
    public boolean update(String index, String id, XContentBuilder source) throws IOException {
        UpdateResponse response = restHighLevelClient.prepareUpdate(index, "_doc", id)
                .setDoc(source)
                .get();
        return response.status().getStatus() == 200;
    }

    /**
     * 根据查询条件查询文档
     * @param index 索引名
     * @param queryBuilder 查询条件
     * @return 查询结果
     */
    public SearchResponse search(String index, QueryBuilder queryBuilder) throws IOException {
        SearchRequest searchRequest = new SearchRequest(index);
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(queryBuilder);
        searchRequest.source(searchSourceBuilder);
        return restHighLevelClient.search(searchRequest);
    }
}

使用时,可以先注入 RestHighLevelClient 对象,然后调用相应的方法即可。

注意:这里的 XContentBuilder 是 Elasticsearch 提供的一种用于构建 JSON 格式文档的工具类,可以通过 XContentFactory 的静态方法构建。例如:

XContentBuilder builder = XContentFactory.jsonBuilder();
builder.startObject();
builder.field("name", "张三");
builder.field("age", 18);
builder.endObject();

这样就可以构建出一个 JSON 格式的文档。在调用 saveOrUpdate 或 update 方法时,可以把 XContentBuilder 对象作为参数传入。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表