ChengDuXiuu
2/29/2020 - 12:59 PM

先什么后什么(先连接后操作)

用户配置是否通过,未通过就不走任何方法

@Slf4j
@Component
public class JeecgElasticsearchTemplate {

    /**
     * 用户配置是否通过,未通过就不走任何方法
     */
    private static boolean configIsPassed = true;
    /**
     * 是否已检测过配置
     */
    private static boolean configIsChecked = false;

    private String baseUrl;

    private final String FORMAT_JSON = "format=json";

    public JeecgElasticsearchTemplate(@Value("${jeecg.elasticsearch.cluster-nodes}") String baseUrl) {
        log.debug("JeecgElasticsearchTemplate BaseURL:" + baseUrl);

        //  未检测过配置,进行检测操作
        if (!configIsChecked) {
            configIsChecked = true;
            // 为空则代表未配置 baseUrl
            if (StringUtils.isEmpty(baseUrl)) {
                configIsPassed = false;
            } else {
                this.baseUrl = baseUrl;
                // 判断配置的地址是否有效
                try {
                    RestUtil.get(this.getBaseUrl().toString());
                } catch (Exception e) {
                    configIsPassed = false;
                }
            }
            if (configIsPassed) {
                log.info("ElasticSearch服务连接成功");
            } else {
                log.warn("ElasticSearch 服务连接失败,原因:配置未通过。可能是BaseURL未配置或配置有误,也可能是Elasticsearch服务未启动。接下来将会拒绝执行任何方法!");
            }
        }
    }

    /**
     * 检查配置是否通过,未通过就抛出异常,中断执行
     */
    private void checkConfig() {
        if (!configIsPassed) {
            throw new RuntimeException("配置未通过,拒绝执行该方法");
        }
    }
    /**
     * 查询单个索引
     * <p>
     * 查询地址:GET http://{baseUrl}/_cat/indices/{indexName}
     */
    public JSONArray getIndices(String indexName) {
        this.checkConfig();
        StringBuilder urlAfter = new StringBuilder("/indices");
        if (!StringUtils.isEmpty(indexName)) {
            urlAfter.append("/").append(indexName.trim().toLowerCase());
        }
        return _cat(urlAfter.toString(), JSONArray.class).getBody();
    }
    /**
     * 保存数据,详见:saveOrUpdate
     */
    public boolean save(String indexName, String typeName, String dataId, JSONObject data) {
        this.checkConfig();
        return this.saveOrUpdate(indexName, typeName, dataId, data);
    }

    /**
     * 更新数据,详见:saveOrUpdate
     */
    public boolean update(String indexName, String typeName, String dataId, JSONObject data) {
        this.checkConfig();
        return this.saveOrUpdate(indexName, typeName, dataId, data);
    }

    /**
     * 保存或修改索引数据
     * <p>
     * 查询地址:PUT http://{baseUrl}/{indexName}/{typeName}/{dataId}
     *
     * @param indexName 索引名称
     * @param typeName  type,一个任意字符串,用于分类
     * @param dataId    数据id
     * @param data      要存储的数据
     * @return
     */
    public boolean saveOrUpdate(String indexName, String typeName, String dataId, JSONObject data) {
        this.checkConfig();
        String url = this.getBaseUrl(indexName, typeName).append("/").append(dataId).toString();
        try {
            // 去掉 data 中为空的值
            Set<String> keys = data.keySet();
            List<String> emptyKeys = new ArrayList<>(keys.size());
            for (String key : keys) {
                String value = data.getString(key);
                if (StringUtils.isEmpty(value)) {
                    emptyKeys.add(key);
                }
            }
            for (String key : emptyKeys) {
                data.remove(key);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        String result = RestUtil.put(url, data).getString("result");
        return "created".equals(result) || "updated".equals(result);
    }

    /**
     * 删除索引数据
     * <p>
     * 请求地址:DELETE http://{baseUrl}/{indexName}/{typeName}/{dataId}
     */
    public boolean delete(String indexName, String typeName, String dataId) {
        this.checkConfig();
        String url = this.getBaseUrl(indexName, typeName).append("/").append(dataId).toString();
        try {
            return "deleted".equals(RestUtil.delete(url).getString("result"));
        } catch (org.springframework.web.client.HttpClientErrorException ex) {
            if (HttpStatus.NOT_FOUND == ex.getStatusCode()) {
                return false;
            } else {
                throw ex;
            }
        }
    }


    /* = = = 以下关于查询和查询条件的方法 = = =*/

    /**
     * 查询数据
     * <p>
     * 请求地址:POST http://{baseUrl}/{indexName}/{typeName}/_search
     */
    public JSONObject search(String indexName, String typeName, JSONObject queryObject) {
        this.checkConfig();
        String url = this.getBaseUrl(indexName, typeName).append("/_search").toString();

        log.info("search: " + queryObject.toJSONString());

        return RestUtil.post(url, queryObject);
    }

    /**
     * @return { "query": query }
     */
    public JSONObject buildQuery(JSONObject query) {
        JSONObject json = new JSONObject();
        json.put("query", query);
        return json;
    }

}