ElasticSearch工具类

本文详细介绍了如何使用Java API进行ElasticSearch的操作,包括索引创建、文档增删改查、复杂查询以及SQL到ElasticSearch的转换,旨在帮助Java开发者更好地集成和利用ElasticSearch。

EsUtil主体功能
package com.example.demo.util.es;

import com.alibaba.fastjson.JSON;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.http.HttpEntity;
import org.apache.http.entity.ContentType;
import org.apache.http.nio.entity.NStringEntity;
import org.apache.http.util.EntityUtils;
import org.elasticsearch.action.ActionListener;
import org.elasticsearch.action.DocWriteResponse;
import org.elasticsearch.action.admin.indices.alias.get.GetAliasesRequest;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.*;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.WildcardQueryBuilder;
import org.elasticsearch.index.reindex.BulkByScrollResponse;
import org.elasticsearch.index.reindex.ReindexRequest;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.FetchSourceContext;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;

import java.io.IOException;
import java.util.*;

/**
 * @author Mr.Ye
 * @version 1.0.0
 * @create 2022-04-12
 * @description ElasticSearch工具类
 * @description 1、初学者建议使用easy-es框架,更加方便;https://easy-es.cn/#/quick-start
 */
public class EsUtil {

    private static Log log = LogFactory.getLog(EsUtil.class);

    /*请求处理时间*/
    private static final String TIME_OUT = "20s";
    private static final String ADD = "ADD";
    private static final String UPDATE = "UPDATE";
    private static final String DELETE = "DELETE";
    /*数据插入主键ID*/
    private static final String ES_ID = "ES_ID";

    private static final String ENDPOINT = "/_sql?format=json";

    /*获取dsl语句*/
    private static final String ENDPOINT_TRANSLATE = "/_sql/translate";


    /**
     * 向es中创建文档索引, 若es中已存在改index,则插入失败。
     *
     * @param indexName 索引名称
     * @param document  id
     * @param jsonStr   json字符串, 要存入的数据
     */
    public Boolean insertIndexWithJsonStr(String indexName, String document, String jsonStr) {
        Boolean indexExists = isIndexExists(indexName, document);
        Boolean result = false;
        if (!indexExists) {
            IndexRequest indexRequest = new IndexRequest(indexName).id(document).source(jsonStr, XContentType.JSON);
            IndexResponse indexResponse = null;
            try {
                indexResponse = EsServerManager.getInstance().getClient().index(indexRequest, RequestOptions.DEFAULT);
                if (indexResponse.getResult() == DocWriteResponse.Result.CREATED) {
                    result = true;
                }
                log.info(indexResponse.getIndex() + "--" + indexResponse.getId() + "--" + "插入成功");

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return result;
    }

    /**
     * 批量处理数据
     *
     * @param indexName 索引名称
     * @param list      数据集合
     * @param type      类型 ADD-添加, UPDATE-更新, DELETE-删除
     */
    public Boolean bulkIndex(String indexName, List<Map<String, Object>> list, String type) {
        BulkRequest bulkRequest = new BulkRequest();
        bulkRequest.timeout(TIME_OUT);
        Boolean result = false;
        for (int i = 0; i < list.size(); i++) {
            //批量添加数据
            //TODO id可以自己设置,这里默认为ES_ID
            if (ADD.equals(type)) {
                IndexRequest source = new IndexRequest(indexName).id(list.get(i).get(ES_ID).toString()).source(list.get(i));
                bulkRequest.add(source);
            } else if (UPDATE.equals(type)) {
                UpdateRequest updateRequest = new UpdateRequest(indexName, list.get(i).get(ES_ID).toString()).doc(list.get(i));
                bulkRequest.add(updateRequest);
            } else if (DELETE.equals(type)) {
                DeleteRequest deleteRequest = new DeleteRequest(indexName, list.get(i).get(ES_ID).toString());
                bulkRequest.add(deleteRequest);
            }
        }
        try {
            BulkResponse bulkResponse = EsServerManager.getInstance().getClient().bulk(bulkRequest, RequestOptions.DEFAULT);
            if (bulkResponse.hasFailures()) {
                /*是否失败,如果是false则成功*/
                log.error("批量插入失败,原因:" + bulkResponse.buildFailureMessage());
                return result;
            } else {
                result = true;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 查询指定id下索引数据
     *
     * @param indexName 索引名称
     * @param document  id
     * @return 返回得到的字符串, 没有返回null
     * {"age":18,"id":1,"name":"xuchenglei"}
     */
    public String queryIndex(String indexName, String document) {
        Boolean indexExists = isIndexExists(indexName, document);
        if (indexExists) {
            GetResponse getResponse = null;
            GetRequest getRequest = new GetRequest(indexName, document);
            try {
                getResponse = EsServerManager.getInstance().getClient().get(getRequest, RequestOptions.DEFAULT);
            } catch (IOException e) {
                e.printStackTrace();
            }
            return getResponse == null ? null : getResponse.getSourceAsString().toString();
        } else {
            return null;
        }
    }

    /**
     * 查询索引下的所有数据
     *
     * @param indexName 索引名称
     * @return 数组形式List<Map < String, Object>>; 没有返回null
     * [{"name":"xuchenglei","id":1,"age":18},{"name":"xuchenglei","id":2,"age":18}]
     */
    public List<Map<String, Object>> queryIndex(String indexName, Integer startNum, Integer pageSize) {
        Boolean indexExists = isIndexExists(indexName);
        if (indexExists) {
            SearchResponse searchResponse = null;
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
            SearchRequest searchRequest = new SearchRequest();
            searchRequest.indices(indexName);
            searchSourceBuilder.from(startNum);
            searchSourceBuilder.size(pageSize);
            searchRequest.source(searchSourceBuilder);
            try {
                searchResponse = EsServerManager.getInstance().getClient().search(searchRequest, RequestOptions.DEFAULT);
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (searchResponse != null) {
                SearchHit[] searchHits = searchResponse.getHits().getHits();
                List<Map<String, Object>> arrayListMap = new ArrayList<Map<String, Object>>();
                for (SearchHit searchHit : searchHits) {
                    Map<String, Object> sourceAsMap = searchHit.getSourceAsMap();
                    arrayListMap.add(sourceAsMap);
                }
                return arrayListMap;
            }
            return null;
        } else {
            return null;
        }
    }

    /**
     * 根据索引名称和id删除数据
     *
     * @param indexName 索引名称
     * @param document  id
     * @return 是否删除成功; 索引不存在返货false
     */
    public Boolean deleteIndex(String indexName, String document) {
        Boolean indexExists = isIndexExists(indexName, document);
        Boolean result = false;
        if (indexExists) {
            DeleteRequest deleteRequest = new DeleteRequest(indexName, document);
            DeleteResponse deleteResponse = null;
            try {
                deleteResponse = EsServerManager.getInstance().getClient().delete(deleteRequest, RequestOptions.DEFAULT);
                if (deleteResponse.getResult() == DocWriteResponse.Result.DELETED) {
                    result = true;
                }
                log.info(deleteResponse.getIndex() + "--" + deleteResponse.getId() + ":已删除");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return result;
    }

    /**
     * 删除indexName下的所有索引数据
     *
     * @param indexName 索引名称
     * @return 删除是否成功。
     */
    public Boolean deleteIndex(String indexName) {
        Boolean indexExists = isIndexExists(indexName);
        Boolean result = false;
        if (indexExists) {
            DeleteIndexRequest deleteRequest = new DeleteIndexRequest(indexName);
            AcknowledgedResponse acknowledgedResponse = null;
            try {
                acknowledgedResponse = EsServerManager.getInstance().getClient().indices().delete(deleteRequest, RequestOptions.DEFAULT);
                if (acknowledgedResponse.isAcknowledged()) {
                    result = true;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return result;
    }

    /**
     * 判断索引是否存在
     *
     * @param indexName 索引名称
     * @param document  id
     * @return true or false
     */
    public Boolean isIndexExists(String indexName, String document) {
        GetRequest getRequest = new GetRequest(indexName, document);
        // 禁用提取源
        getRequest.fetchSourceContext(new FetchSourceContext(false));
        // 禁用提取存储字段
        getRequest.storedFields("_none_");

        Boolean exists = false;
        try {
            exists = EsServerManager.getInstance().getClient().exists(getRequest, RequestOptions.DEFAULT);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return exists;
    }

    /**
     * 判断索引是否存在
     *
     * @param indexName 索引名称
     * @return true or false
     */
    public Boolean isIndexExists(String indexName) {
        GetIndexRequest getIndexRequest = new GetIndexRequest(indexName);
        Boolean exists = false;
        try {
            exists = EsServerManager.getInstance().getClient().indices().exists(getIndexRequest, RequestOptions.DEFAULT);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return exists;
    }

    /**
     * 查询出所有的index
     *
     * @return 查询出所有的索引 Set<String>
     */
    public Set<String> queryAllIndex() {
        GetAliasesRequest getAliasesRequest = new GetAliasesRequest();
        Set<String> indexNameKeySet = new HashSet<String>();
        try {
            GetAliasesResponse getAliasesResponse = EsServerManager.getInstance().getClient().indices().getAlias(getAliasesRequest, RequestOptions.DEFAULT);
            Set<String> keySet = getAliasesResponse.getAliases().keySet();
            for (String s : keySet) {
                if (!s.startsWith(".")) {
                    indexNameKeySet.add(s);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return indexNameKeySet;
    }

    /**
     * 根据 index 和 id 更新 索引数据
     *
     * @param indexName 索引名称
     * @param document  id
     * @return 是否更新成功
     */
    public Boolean updateIndex(String indexName, String document, String jsonStr) {
        Boolean indexExists = isIndexExists(indexName, document);
        Boolean result = false;
        if (indexExists) {
            UpdateRequest updateRequest = new UpdateRequest(indexName, document).doc(jsonStr, XContentType.JSON);
            UpdateResponse updateResponse = null;
            try {
                updateResponse = EsServerManager.getInstance().getClient().update(updateRequest, RequestOptions.DEFAULT);
                if (updateResponse.getResult() == DocWriteResponse.Result.UPDATED) {
                    result = true;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return result;
    }

    /**
     * 全量匹配查询
     *
     * @param field     属性
     * @param text      值
     * @param indexName 索引名称
     * @param startNum  开始的位置
     * @param pageSize  分页的大小
     * @return 返回符合条件的值
     */
    public String search(String field, String text, String indexName, Integer startNum, Integer pageSize) {
        List<Map<String, Object>> resultMapList = new ArrayList<Map<String, Object>>();
        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices(indexName);
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.matchAllQuery());
        searchRequest.source(searchSourceBuilder);
        searchSourceBuilder.query(QueryBuilders.termQuery(field, text));

        searchSourceBuilder.from(startNum);
        searchSourceBuilder.size(pageSize);

        searchRequest.source(searchSourceBuilder);
        SearchResponse searchResponse = null;
        try {
            searchResponse = EsServerManager.getInstance().getClient().search(searchRequest, RequestOptions.DEFAULT);
            SearchHit[] searchHits = searchResponse.getHits().getHits();
            for (SearchHit hit : searchHits) {
                Map<String, Object> sourceAsMap = hit.getSourceAsMap();
                resultMapList.add(sourceAsMap);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return JSON.toJSONString(resultMapList);
    }

    /**
     * 模糊查询, 并实现高亮
     *
     * @param field     属性名,字段名称
     * @param text      value 希望高亮的值
     * @param indexName 索引名称
     * @return json
     */
    public String searchFuzzy(String field, String text, String indexName, Integer startNum, Integer pageSize) throws IOException {
        List<Map<String, Object>> resultMapList = new ArrayList<Map<String, Object>>();
        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices(indexName);
        /*查询构造器*/
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        /*模糊查询 wildcardQuery*/
        /*wildcardQuery 是 term 级别的 query,经过分词器以后,text的值会被分开,
        根据倒排索引内容中就不会存在 完整text值,导致正常情况下查询不到数据,所以 field.keyword可以精准匹配*/
        WildcardQueryBuilder queryBuilder = QueryBuilders.wildcardQuery(field, "*" + text + "*");
        searchSourceBuilder.query(queryBuilder);
        searchSourceBuilder.from(startNum);
        searchSourceBuilder.size(pageSize);
        searchRequest.source(searchSourceBuilder);
        // 设置高亮
        HighlightBuilder highlightBuilder = new HighlightBuilder();
        HighlightBuilder.Field highlightTitle = new HighlightBuilder.Field(field);
        //unified:使用Luncene同一的highlighter
        highlightTitle.highlighterType("unified");
        highlightBuilder.field(highlightTitle);
        /*自定义高亮标签*/
        highlightBuilder.preTags("<span style=\"color:red\">");
        highlightBuilder.postTags("</span>");
        //设置为0即可返回完整内容 而非片段 TODO
        highlightBuilder.numOfFragments(0);
        searchSourceBuilder.highlighter(highlightBuilder);
        SearchResponse searchResponse = null;
        try {
            //获取结果
            searchResponse = EsServerManager.getInstance().getClient().search(searchRequest, RequestOptions.DEFAULT);
            /*es返回内容 都在hits中*/
            SearchHit[] searchHits = searchResponse.getHits().getHits();
            for (SearchHit hit : searchHits) {
                //处理高亮内容
                Map<String, HighlightField> highlightFields = hit.getHighlightFields();
                HighlightField highlightField = highlightFields.get(field);
                Text[] fragments = highlightField.fragments();
                Map<String, Object> sourceAsMap = hit.getSourceAsMap();
                sourceAsMap.put(field, fragments[0].string());
                resultMapList.add(sourceAsMap);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return JSON.toJSONString(resultMapList);
    }

    /**
     * 获取当前索引下的数据量
     *
     * @param indexName 索引名称
     * @return 数据量条数
     */
    public Long searchTotalHitsNum(String indexName) {
        Boolean indexExists = isIndexExists(indexName);
        Long result = -1L;
        if (indexExists) {
            SearchRequest searchRequest = new SearchRequest(indexName);
            SearchResponse searchResponse = null;
            try {
                searchResponse = EsServerManager.getInstance().getClient().search(searchRequest, RequestOptions.DEFAULT);
                result = searchResponse.getHits().getTotalHits().value;
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return result;
    }

    /**
     * 向es中创建文档索引, 若es中已存在改index,则插入失败。(异步)
     *
     * @param indexName 索引名称
     * @param document  id
     * @param jsonStr   json字符串, 要存入的数据
     */
    public void insertIndexWithJsonStrAsync(String indexName, String document, String jsonStr) {
        Boolean indexExists = isIndexExists(indexName, document);
        if (!indexExists) {
            IndexRequest indexRequest = new IndexRequest(indexName).id(document).source(jsonStr, XContentType.JSON);
            ActionListener<IndexResponse> listener = new ActionListener<IndexResponse>() {
                @Override
                public void onResponse(IndexResponse indexResponse) {
                    log.info("索引" + indexResponse.getIndex() + "--" + indexResponse.getId() + "插入成功");
                }

                @Override
                public void onFailure(Exception e) {
                    e.printStackTrace();
                }
            };
            EsServerManager.getInstance().getClient().indexAsync(indexRequest, RequestOptions.DEFAULT, listener);
        } else {
            log.info("插入失败" + "索引" + indexName + "--" + document + "--" + "已存在");
        }
    }

    /**
     * 根据索引名称和id删除数据,(异步)
     *
     * @param indexName 索引名称
     * @param document  id
     * @return 是否删除成功; 索引不存在返货false
     */
    public void deleteIndexAsync(String indexName, String document) {
        Boolean indexExists = isIndexExists(indexName, document);
        if (indexExists) {
            final DeleteRequest deleteRequest = new DeleteRequest(indexName, document);
            ActionListener<DeleteResponse> listener = new ActionListener<DeleteResponse>() {
                @Override
                public void onResponse(DeleteResponse deleteResponse) {
                    log.info(deleteResponse.getIndex() + "--" + deleteResponse.getId() + "已删除");
                }

                @Override
                public void onFailure(Exception e) {
                    e.printStackTrace();
                }
            };
            EsServerManager.getInstance().getClient().deleteAsync(deleteRequest, RequestOptions.DEFAULT, listener);
        } else {
            log.info("索引" + indexName + "--" + document + "不存在");
        }
    }

    /**
     * 删除indexName下的所有索引数据,(异步)
     *
     * @param indexName 索引名称
     * @return 删除是否成功。
     */
    public void deleteIndexAsync(String indexName) {
        Boolean indexExists = isIndexExists(indexName);
        if (indexExists) {
            final DeleteIndexRequest deleteRequest = new DeleteIndexRequest(indexName);
            ActionListener<AcknowledgedResponse> listener = new ActionListener<AcknowledgedResponse>() {
                @Override
                public void onResponse(AcknowledgedResponse AcknowledgedResponse) {
                    log.info(AcknowledgedResponse.toString());
                }

                @Override
                public void onFailure(Exception e) {
                    e.printStackTrace();
                }
            };
            EsServerManager.getInstance().getClient().indices().deleteAsync(deleteRequest, RequestOptions.DEFAULT, listener);
        } else {
            log.info("索引" + indexName + "不存在");
        }
    }

    /**
     * 根据 index 和 id 更新 索引数据 (异步)
     *
     * @param indexName 索引名称
     * @param document  id
     * @param jsonStr   要更新的json
     * @return 是否更新成功
     */
    public void updateIndexAsync(String indexName, String document, String jsonStr) {
        Boolean indexExists = isIndexExists(indexName, document);
        if (indexExists) {
            final UpdateRequest updateRequest = new UpdateRequest(indexName, document).doc(jsonStr, XContentType.JSON);
            ActionListener<UpdateResponse> listener = new ActionListener<UpdateResponse>() {
                @Override
                public void onResponse(UpdateResponse updateResponse) {
                    log.info("索引" + updateResponse.getIndex() + "--" + updateResponse.getId() + "更新成功");
                }

                @Override
                public void onFailure(Exception e) {
                    e.printStackTrace();
                }
            };
            EsServerManager.getInstance().getClient().updateAsync(updateRequest, RequestOptions.DEFAULT, listener);
        } else {
            log.info("索引" + indexName + "--" + document + "不存在");
        }
    }

    /**
     * 索引重建(同步)。 注意:目标索引需要提前创建好
     *
     * @param fromIndex 重新索引的索引名
     * @param destIndex 重新索引后的索引名
     * @return 新创建的文档数
     */
    public Long reIndex(String fromIndex, String destIndex) {
        Boolean fromIndexExists = isIndexExists(fromIndex);
        Boolean destIndexExists = isIndexExists(destIndex);
        Long result = 0L;
        if (fromIndexExists && destIndexExists) {
            ReindexRequest reindexRequest = new ReindexRequest();
            reindexRequest.setSourceIndices(fromIndex);
            reindexRequest.setDestIndex(destIndex);
            BulkByScrollResponse reindexResponse = null;
            try {
                reindexResponse = EsServerManager.getInstance().getClient().reindex(reindexRequest, RequestOptions.DEFAULT);
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (reindexResponse != null) {
                result = reindexResponse.getCreated();
            }
        } else {
            if (!fromIndexExists) {
                log.info("fromIndex不存在");
            }
            if (!destIndexExists) {
                log.info("destIndex不存在");
            }
        }
        return result;
    }

    /**
     * 索引重建(异步)。 注意:目标索引需要提前创建好
     *
     * @param fromIndex 重新索引的索引名
     * @param destIndex 重新索引后的索引名
     */
    public void reIndexAsync(String fromIndex, String destIndex) {
        Boolean fromIndexExists = isIndexExists(fromIndex);
        Boolean destIndexExists = isIndexExists(destIndex);
        if (fromIndexExists && destIndexExists) {
            ReindexRequest reindexRequest = new ReindexRequest();
            reindexRequest.setSourceIndices(fromIndex);
            reindexRequest.setDestIndex(destIndex);
            ActionListener<BulkByScrollResponse> actionListener = new ActionListener<BulkByScrollResponse>() {
                @Override
                public void onResponse(BulkByScrollResponse bulkByScrollResponse) {
                    log.info("新创建的索引数" + bulkByScrollResponse.getCreated());
                    log.info("更新的索引数" + bulkByScrollResponse.getUpdated());
                }

                @Override
                public void onFailure(Exception e) {
                    e.printStackTrace();
                }
            };
            EsServerManager.getInstance().getClient().reindexAsync(reindexRequest, RequestOptions.DEFAULT, actionListener);
        } else {
            if (!fromIndexExists) {
                log.info("fromIndex不存在");
            }
            if (!destIndexExists) {
                log.info("destIndex不存在");
            }
        }
    }

    /**
     * 关闭连接
     */
    public void close() {
        EsServerManager.getInstance().close();
    }

    /**
     * sql查询
     *
     * @param sql    sql语句
     * @param size   查询数量
     * @param method 查询方式
     * @return 查询结果 json字符串
     */
    public String sqlQuery(String sql, Integer size, String method) throws IOException {
        RestClient restClient = EsServerManager.getInstance().getRestClient();
        Map<String, Object> postData = new HashMap<>();
        postData.put("query", sql);
        if (null != size) {
            postData.put("fetch_size", size);
        }
        HttpEntity entity = new NStringEntity(JSON.toJSONString(postData), ContentType.APPLICATION_JSON);
        //获取request对象
        Request request = new Request(method, ENDPOINT);
        request.setEntity(entity);
        Response response = restClient.performRequest(request);
        HttpEntity httpEntity = response.getEntity();
        return EntityUtils.toString(httpEntity);
    }

    /**
     * sql转化成DSL语句
     *
     * @param sql    sql语句
     * @param size   查询数量
     * @param method 查询方式
     * @return DSL语句 json字符串
     */
    public String sqlTranslate(String sql, Integer size, String method) throws IOException {
        RestClient restClient = EsServerManager.getInstance().getRestClient();
        Map<String, Object> postData = new HashMap<>();
        postData.put("query", sql);
        if (null != size) {
            postData.put("fetch_size", size);
        }
        HttpEntity entity = new NStringEntity("{\"query\":\"" + sql + "\"}", ContentType.APPLICATION_JSON);
        //获取request对象
        Request request = new Request(method, ENDPOINT_TRANSLATE);
        request.setEntity(entity);
        Response response = restClient.performRequest(request);
        HttpEntity httpEntity = response.getEntity();
        return EntityUtils.toString(httpEntity);
    }

    /**
     * Dsl语句执行
     * @param Dsl 语句
     * @param indexName 索引名
     * @Description: TODO 直接执行Dsl语句 当前执行逻辑有问题,需要改进
     */
    public String DslExecute(String Dsl, String indexName) {
        List<Map<String, Object>> resultMapList = new ArrayList<>();
        RestClient restClient = EsServerManager.getInstance().getRestClient();
        Request request = new Request("POST", Dsl.trim());
        try {
            Response response = restClient.performRequest(request);
            HttpEntity httpEntity = response.getEntity();
            String result = EntityUtils.toString(httpEntity);
            System.out.println(result);
//            SearchHit[] hits = search.getHits().getHits();
//            for (SearchHit hit : hits) {
//                Map<String, Object> sourceAsMap = hit.getSourceAsMap();
//                resultMapList.add(sourceAsMap);
//                System.out.println(sourceAsMap);
//            }
        }catch (Exception e){
            e.printStackTrace();
            return e.getMessage();
        }
        return JSON.toJSONString(resultMapList);
    }

    public static void main(String[] args) throws IOException {
        String indexName = "jd_goods";
        String document = "";
        EsUtil esUtil = new EsUtil();
//        String s = esUtil.sqlQuery("select * from jd_goods where name like '%联系%'", null,"GET");
//        System.out.println(s);
        String s = esUtil.sqlTranslate("select name,count(*) from jd_goods where name like '%联系%' group by name", null, "GET");
        System.out.println(s);
        esUtil.DslExecute(s, indexName);
        //获取索引库所有数据
//        String s = esUtil.queryIndex(indexName, 0,100);
//        List<Map<String, Object>> list = esUtil.queryIndex(indexName, 0, 100);
//        list.forEach(map -> {
//           for (String key : map.keySet()) {
//               System.out.println(key + ":" + map.get(key));
//           }
//        });
        //高亮
        /*keyword 要求全字段 精准匹配*/
//        String s = esUtil.searchFuzzy("name.keyword", "联想", indexName, 0, 100);
//        System.out.println(s);

//        Set<String> strings = esUtil.queryAllIndex();
//        for (String s : strings) {
//            System.out.println(s);
//        }

    }
}

EsServer客户端初始化
package com.example.demo.util.es;

import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;

/**
 * @author Mr.ye
 * @Date 2022/4/12 14:34
 * @Description: 单例获取es客户端
 */
public class EsServerManager {

    private static EsServerManager instance;
    private static RestHighLevelClient client;
    private static RestClient restClient;

    private EsServerManager(){
        System.out.println("初始化es客户端");
        HttpHost host = new HttpHost("127.0.0.1", 9200, "http");
        restClient = RestClient.builder(host).build();
        client = new RestHighLevelClient(RestClient.builder(host));
    }

    public static synchronized EsServerManager getInstance(){
        if(instance == null){
            instance = new EsServerManager();
        }
        return instance;
    }

    public RestHighLevelClient getClient(){
        return client;
    }

    public RestClient getRestClient(){
        return restClient;
    }

    public void close() {
        if (client != null) {
            try {
                client.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        if (restClient != null) {
            try {
                restClient.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值