Elasticsearch 的sql查询Java工具类

本文介绍了一个针对Elasticsearch 6版本以上的SQL查询Java工具类,该工具类目前仅封装了查询功能,利用xpack插件进行SQL查询,并将结果转化为目标类。未来计划扩展增删改操作。由于作者已更换工作,部分工具类代码丢失,文中提供了一个经过修改的时间转换方法,需要引入Hutool工具包。
摘要由CSDN通过智能技术生成
import com.alibaba.fastjson.JSONObject;
import com.unichain.statistics.utils.DateUtil;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.lang.reflect.Field;
import java.util.*;

public class EsQueryUtils {

    private static String esUrl = "http://127.0.0.1:9200/_xpack/sql?format=json";

    /** logger */
    private static final Logger log = LoggerFactory.getLogger(EsQueryUtils.class);

    /**
     * esSql查询 sql语句中需要用到参数的地方, 请用#{param} 的形式修饰,#{}符号中间的单词就是第二个参数中的某个键
     * @param sql sql语句
     * @param params 参数 一个key对应一个参数
     * @param className 目标类的class
     * @return
     */
    public static <T> List<T> query(String sql, Map<String, Object> params, Class<T> className) {
        if (StringUtils.isBlank(sql)) {
            return new ArrayList<>();
        }
        log.debug("es查询sql入参 >>> {}", sql);
        log.debug("es查询param入参 >>> {}", JSONObject.toJSONString(params));

        // 转换sql参数
        if (params != null && params.size() != 0) {
            params.keySet().forEach(key -> {
                sql.replace("#{" + key + "}", params.toString());
            });
        }

        Map<String, Object> query = new HashMap<>();
        query.put("query", sql);

        JSONObject response = JSONObject.parseObject(HttpUtils.doPost(esUrl, JSONObject.toJSONString(query)));

        List<Columns> columns = JSONObject.parseArray(response.getString("columns"), Columns.class);
        List<List> rows = JSONObject.parseArray(response.getString("rows"), List.class);
        EsModel esModel = new EsModel(columns, rows);

        return esModelToJavaObject(esModel, className);
    }

    /**
     * model转换实体类
     * @author youao.du@gmail.com
     * @param esModel
     * @param className
     * @param <T>
     * @return
     */
    private static <T> List<T> esModelToJavaObject(EsModel esModel, Class<T> className) {
        Field[] fields = className.getDeclaredFields();
        List<T> result = new ArrayList<>(esModel.getRows().size());
        esModel.getRows().forEach(row -> {
            try {
                // 判断是不是基本数据类型
                if (!isBasicType(className)) {
                    // 新增实体
                    T t = className.newInstance();
                    for (int i = 0; i < fields.length; i++) {
                        // 设置该属性可以修改
                        fields[i].setAccessible(true);
                        for (int j = 0; j < esModel.getColumns().size(); j++) {
                            // 判断属性名和es返回的列名一致
 
Java连接Elasticsearch-SQL有多种方式,以下是其中一种常用的方式: 1. 使用JDBC驱动连接Elasticsearch-SQL 首先需要下载elasticsearch-jdbc驱动包,然后在Java项目中引入该驱动包,之后就可以使用JDBC连接Elasticsearch-SQL了。以下是一个简单的示例代码: ``` // 加载驱动 Class.forName("org.elasticsearch.jdbc.Driver"); // 连接ES-SQL Connection conn = DriverManager.getConnection("jdbc:elasticsearch://localhost:9200"); // 执行查询语句 Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM my_index WHERE age > 18"); // 处理查询结果 while (rs.next()) { System.out.println(rs.getString("name") + ", " + rs.getInt("age")); } // 关闭连接 rs.close(); stmt.close(); conn.close(); ``` 上述代码中,我们首先通过 `Class.forName` 方法加载了 `org.elasticsearch.jdbc.Driver` 驱动,然后使用 `DriverManager.getConnection` 方法连接到 Elasticsearch-SQL 的地址,接着可以使用 `Connection.createStatement` 方法创建一个 `Statement` 对象,执行 SQL 查询语句,并使用 `ResultSet` 对象处理查询结果。 2. 使用Spring Data Elasticsearch Spring Data Elasticsearch 是 Spring 官方提供的用于操作 Elasticsearch 的框架,它提供了丰富的 API 接口和操作 Elasticsearch工具类,可以方便地实现 Elasticsearch 的各种操作。以下是一个简单的示例代码: ``` // 创建ElasticsearchTemplate对象 ElasticsearchTemplate elasticsearchTemplate = new ElasticsearchTemplate(client); // 执行查询操作 SearchQuery searchQuery = new NativeSearchQueryBuilder() .withQuery(QueryBuilders.matchQuery("name", "张三")) .build(); List<User> users = elasticsearchTemplate.queryForList(searchQuery, User.class); // 处理查询结果 for (User user : users) { System.out.println(user.getName() + ", " + user.getAge()); } ``` 上述代码中,我们首先创建了一个 `ElasticsearchTemplate` 对象,它是 Spring Data Elasticsearch 提供的操作 Elasticsearch 的核心类之一。然后使用 `NativeSearchQueryBuilder` 构建一个查询条件,最后使用 `elasticsearchTemplate.queryForList` 方法执行查询操作,并将查询结果转换成 `User` 类型的对象列表。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值