说明:通过http请求的方式来实现操作ES;

      9200端口:用于外部通讯,基于http RESTful协议,实现程序与es的通信;9300端口: ES节点之间通讯使用

例如获取所有索引:

    请求:http://1.116.145.14:9200/_cat/indices?format=json

例如查询索引qzt_index类型user ID为1的数据:

   请求:http://1.116.145.14:9200/qzt_index/user/1返回:[{"name":"wangming","age":20,"sex":0}]

例如分页查询from、size

    http://1.116.145.14:9200/qzt_index/user/_search?from=2&size=3from 偏移,默认为0size 返回的结果数,默认为10

​1. ES操作工具类模板

package org.jeecg.common.es;import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.jeecg.common.util.RestUtil;
import org.jeecg.common.util.oConvertUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;import java.util.*;/*** 关于 ElasticSearch 的一些方法(创建索引、添加数据、查询等)** @author sunjianlei*/
@Slf4j
@Component
public class JeecgElasticsearchTemplate {/** es服务地址 */private String baseUrl;private final String FORMAT_JSON = "format=json";// ElasticSearch 最大可返回条目数public static final int ES_MAX_SIZE = 10000;// 构造方式从配置文件中读取ES地址public JeecgElasticsearchTemplate(@Value("${jeecg.elasticsearch.cluster-nodes}") String baseUrl, @Value("${jeecg.elasticsearch.check-enabled}") boolean checkEnabled) {log.debug("JeecgElasticsearchTemplate BaseURL:" + baseUrl);if (StringUtils.isNotEmpty(baseUrl)) {this.baseUrl = baseUrl;// 验证配置的ES地址是否有效if (checkEnabled) {try {RestUtil.get(this.getBaseUrl().toString());log.info("ElasticSearch 服务连接成功");} catch (Exception e) {log.warn("ElasticSearch 服务连接失败,原因:配置未通过。可能是BaseURL未配置或配置有误,也可能是Elasticsearch服务未启动。接下来将会拒绝执行任何方法!");}}}}public StringBuilder getBaseUrl(String indexName, String typeName) {typeName = typeName.trim().toLowerCase();return this.getBaseUrl(indexName).append("/").append(typeName);}public StringBuilder getBaseUrl(String indexName) {indexName = indexName.trim().toLowerCase();return this.getBaseUrl().append("/").append(indexName);}public StringBuilder getBaseUrl() {return new StringBuilder("http://").append(this.baseUrl);}/*** cat 查询ElasticSearch系统数据,返回json*/public <T> ResponseEntity<T> _cat(String urlAfter, Class<T> responseType) {String url = this.getBaseUrl().append("/_cat").append(urlAfter).append("?").append(FORMAT_JSON).toString();return RestUtil.request(url, HttpMethod.GET, null, null, null, responseType);}/*** 查询所有索引* <p>* 查询地址:GET http://{baseUrl}/_cat/indices*/public JSONArray getIndices() {return getIndices(null);}/*** 查询单个索引* <p>* 查询地址:GET http://{baseUrl}/_cat/indices/{indexName}*/public JSONArray getIndices(String indexName) {StringBuilder urlAfter = new StringBuilder("/indices");if (!StringUtils.isEmpty(indexName)) {urlAfter.append("/").append(indexName.trim().toLowerCase());}return _cat(urlAfter.toString(), JSONArray.class).getBody();}/*** 索引是否存在*/public boolean indexExists(String indexName) {try {JSONArray array = getIndices(indexName);return array != null;} catch (org.springframework.web.client.HttpClientErrorException ex) {if (HttpStatus.NOT_FOUND == ex.getStatusCode()) {return false;} else {throw ex;}}}/*** 根据ID获取索引数据,未查询到返回null* <p>* 查询地址:GET http://{baseUrl}/{indexName}/{typeName}/{dataId}** @param indexName 索引名称* @param typeName  type,一个任意字符串,用于分类* @param dataId    数据id* @return*/public JSONObject getDataById(String indexName, String typeName, int dataId) {String url = this.getBaseUrl(indexName, typeName).append("/").append(dataId).toString();log.info("url:" + url);JSONObject result = RestUtil.get(url);boolean found = result.getBoolean("found");if (found) {return result.getJSONObject("_source");} else {return null;}}/*** 创建索引* <p>* 查询地址:PUT http://{baseUrl}/{indexName}*/public boolean createIndex(String indexName) {String url = this.getBaseUrl(indexName).toString();/* 返回结果 (仅供参考)"createIndex": {"shards_acknowledged": true,"acknowledged": true,"index": "hello_world"}*/try {return RestUtil.put(url).getBoolean("acknowledged");} catch (org.springframework.web.client.HttpClientErrorException ex) {if (HttpStatus.BAD_REQUEST == ex.getStatusCode()) {log.warn("索引创建失败:" + indexName + " 已存在,无需再创建");} else {ex.printStackTrace();}}return false;}/*** 删除索引* <p>* 查询地址:DELETE http://{baseUrl}/{indexName}*/public boolean removeIndex(String indexName) {String url = this.getBaseUrl(indexName).toString();try {return RestUtil.delete(url).getBoolean("acknowledged");} catch (org.springframework.web.client.HttpClientErrorException ex) {if (HttpStatus.NOT_FOUND == ex.getStatusCode()) {log.warn("索引删除失败:" + indexName + " 不存在,无需删除");} else {ex.printStackTrace();}}return false;}/*** 获取索引字段映射(可获取字段类型)* <p>** @param indexName 索引名称* @param typeName  分类名称* @return*/public JSONObject getIndexMapping(String indexName, String typeName) {String url = this.getBaseUrl(indexName, typeName).append("/_mapping?").append(FORMAT_JSON).toString();log.info("getIndexMapping-url:" + url);/** 参考返回JSON结构:**{*    // 索引名称*    "[indexName]": {*        "mappings": {*            // 分类名称*            "[typeName]": {*                "properties": {*                    // 字段名*                    "input_number": {*                        // 字段类型*                        "type": "long"*                    },*                    "input_string": {*                        "type": "text",*                        "fields": {*                            "keyword": {*                                "type": "keyword",*                                "ignore_above": 256*                            }*                        }*                    }*                 }*            }*        }*    }* }*/try {return RestUtil.get(url);} catch (org.springframework.web.client.HttpClientErrorException e) {String message = e.getMessage();if (message != null && message.contains("404 Not Found")) {return null;}throw e;}}/*** 获取索引字段映射,返回Java实体类** @param indexName* @param typeName* @return*/public <T> Map<String, T> getIndexMappingFormat(String indexName, String typeName, Class<T> clazz) {JSONObject mapping = this.getIndexMapping(indexName, typeName);Map<String, T> map = new HashMap<>();if (mapping == null) {return map;}// 获取字段属性JSONObject properties = mapping.getJSONObject(indexName).getJSONObject("mappings").getJSONObject(typeName).getJSONObject("properties");// 封装成 java类型for (String key : properties.keySet()) {T entity = properties.getJSONObject(key).toJavaObject(clazz);map.put(key, entity);}return map;}/*** 保存数据,详见:saveOrUpdate*/public boolean save(String indexName, String typeName, String dataId, JSONObject data) {return this.saveOrUpdate(indexName, typeName, dataId, data);}/*** 更新数据,详见:saveOrUpdate*/public boolean update(String indexName, String typeName, String dataId, JSONObject data) {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) {String url = this.getBaseUrl(indexName, typeName).append("/").append(dataId).append("?refresh=wait_for").toString();/* 返回结果(仅供参考)"createIndexA2": {"result": "created","_shards": {"total": 2,"successful": 1,"failed": 0},"_seq_no": 0,"_index": "test_index_1","_type": "test_type_1","_id": "a2","_version": 1,"_primary_term": 1}*/try {// 去掉 data 中为空的值Set<String> keys = data.keySet();List<String> emptyKeys = new ArrayList<>(keys.size());for (String key : keys) {String value = data.getString(key);//1、剔除空值if (oConvertUtils.isEmpty(value) || "[]".equals(value)) {emptyKeys.add(key);}//2、剔除上传控件值(会导致ES同步失败,报异常failed to parse field [ge_pic] of type [text] )if (oConvertUtils.isNotEmpty(value) && value.indexOf("[{")!=-1) {emptyKeys.add(key);log.info("-------剔除上传控件字段------------key: "+ key);}}for (String key : emptyKeys) {data.remove(key);}} catch (Exception e) {e.printStackTrace();}try {String result = RestUtil.put(url, data).getString("result");return "created".equals(result) || "updated".equals(result);} catch (Exception e) {log.error(e.getMessage() + "\n-- url: " + url + "\n-- data: " + data.toJSONString());//TODO 打印接口返回异常jsonreturn false;}}/*** 批量保存数据** @param indexName 索引名称* @param typeName  type,一个任意字符串,用于分类* @param dataList  要存储的数据数组,每行数据必须包含id* @return*/public boolean saveBatch(String indexName, String typeName, JSONArray dataList) {String url = this.getBaseUrl().append("/_bulk").append("?refresh=wait_for").toString();StringBuilder bodySB = new StringBuilder();for (int i = 0; i < dataList.size(); i++) {JSONObject data = dataList.getJSONObject(i);String id = data.getString("id");// 该行的操作// {"create": {"_id":"${id}", "_index": "${indexName}", "_type": "${typeName}"}}JSONObject action = new JSONObject();JSONObject actionInfo = new JSONObject();actionInfo.put("_id", id);actionInfo.put("_index", indexName);actionInfo.put("_type", typeName);action.put("create", actionInfo);bodySB.append(action.toJSONString()).append("\n");// 该行的数据data.remove("id");bodySB.append(data.toJSONString()).append("\n");}System.out.println("+-+-+-: bodySB.toString(): " + bodySB.toString());HttpHeaders headers = RestUtil.getHeaderApplicationJson();RestUtil.request(url, HttpMethod.PUT, headers, null, bodySB, JSONObject.class);return true;}/*** 删除索引数据* <p>* 请求地址:DELETE http://{baseUrl}/{indexName}/{typeName}/{dataId}*/public boolean delete(String indexName, String typeName, String dataId) {String url = this.getBaseUrl(indexName, typeName).append("/").append(dataId).toString();/* 返回结果(仅供参考){"_index": "es_demo","_type": "docs","_id": "001","_version": 3,"result": "deleted","_shards": {"total": 1,"successful": 1,"failed": 0},"_seq_no": 28,"_primary_term": 18}*/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) {String url = this.getBaseUrl(indexName, typeName).append("/_search").toString();log.info("url:" + url + " ,search: " + queryObject.toJSONString());JSONObject res = RestUtil.post(url, queryObject);log.info("url:" + url + " ,return res: \n" + res.toJSONString());return res;}/*** @param _source (源滤波器)指定返回的字段,传null返回所有字段* @param query* @param from    从第几条数据开始* @param size    返回条目数* @return { "query": query }*/public JSONObject buildQuery(List<String> _source, JSONObject query, int from, int size) {JSONObject json = new JSONObject();if (_source != null) {json.put("_source", _source);}json.put("query", query);json.put("from", from);json.put("size", size);return json;}/*** @return { "bool" : { "must": must, "must_not": mustNot, "should": should } }*/public JSONObject buildBoolQuery(JSONArray must, JSONArray mustNot, JSONArray should) {JSONObject bool = new JSONObject();if (must != null) {bool.put("must", must);}if (mustNot != null) {bool.put("must_not", mustNot);}if (should != null) {bool.put("should", should);}JSONObject json = new JSONObject();json.put("bool", bool);return json;}/*** @param field 要查询的字段* @param args  查询参数,参考: *哈哈* OR *哒* NOT *呵* OR *啊** @return*/public JSONObject buildQueryString(String field, String... args) {if (field == null) {return null;}StringBuilder sb = new StringBuilder(field).append(":(");if (args != null) {for (String arg : args) {sb.append(arg).append(" ");}}sb.append(")");return this.buildQueryString(sb.toString());}/*** @return { "query_string": { "query": query }  }*/public JSONObject buildQueryString(String query) {JSONObject queryString = new JSONObject();queryString.put("query", query);JSONObject json = new JSONObject();json.put("query_string", queryString);return json;}/*** @param field      查询字段* @param min        最小值* @param max        最大值* @param containMin 范围内是否包含最小值* @param containMax 范围内是否包含最大值* @return { "range" : { field : { 『 "gt『e』?containMin" : min 』?min!=null , 『 "lt『e』?containMax" : max 』}} }*/public JSONObject buildRangeQuery(String field, Object min, Object max, boolean containMin, boolean containMax) {JSONObject inner = new JSONObject();if (min != null) {if (containMin) {inner.put("gte", min);} else {inner.put("gt", min);}}if (max != null) {if (containMax) {inner.put("lte", max);} else {inner.put("lt", max);}}JSONObject range = new JSONObject();range.put(field, inner);JSONObject json = new JSONObject();json.put("range", range);return json;}}

1.1.ElasticSearch 的 queryString

package org.jeecg.common.es;/*** 用于创建 ElasticSearch 的 queryString** @author sunjianlei*/
public class QueryStringBuilder {StringBuilder builder;public QueryStringBuilder(String field, String str, boolean not, boolean addQuot) {builder = this.createBuilder(field, str, not, addQuot);}public QueryStringBuilder(String field, String str, boolean not) {builder = this.createBuilder(field, str, not, true);}/*** 创建 StringBuilder** @param field* @param str* @param not     是否是不匹配* @param addQuot 是否添加双引号* @return*/public StringBuilder createBuilder(String field, String str, boolean not, boolean addQuot) {StringBuilder sb = new StringBuilder(field).append(":(");if (not) {sb.append(" NOT ");}this.addQuotEffect(sb, str, addQuot);return sb;}public QueryStringBuilder and(String str) {return this.and(str, true);}public QueryStringBuilder and(String str, boolean addQuot) {builder.append(" AND ");this.addQuot(str, addQuot);return this;}public QueryStringBuilder or(String str) {return this.or(str, true);}public QueryStringBuilder or(String str, boolean addQuot) {builder.append(" OR ");this.addQuot(str, addQuot);return this;}public QueryStringBuilder not(String str) {return this.not(str, true);}public QueryStringBuilder not(String str, boolean addQuot) {builder.append(" NOT ");this.addQuot(str, addQuot);return this;}/*** 添加双引号(模糊查询,不能加双引号)*/private QueryStringBuilder addQuot(String str, boolean addQuot) {return this.addQuotEffect(this.builder, str, addQuot);}/*** 是否在两边加上双引号* @param builder* @param str* @param addQuot* @return*/private QueryStringBuilder addQuotEffect(StringBuilder builder, String str, boolean addQuot) {if (addQuot) {builder.append('"');}builder.append(str);if (addQuot) {builder.append('"');}return this;}@Overridepublic String toString() {return builder.append(")").toString();}}

2.测试操作ES

package org.jeecg.modules.cloud.lock;import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.es.JeecgElasticsearchTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;/*** 分布式锁测试demo*/
@Slf4j
@Component
public class DemoLockTest {@Autowiredprivate JeecgElasticsearchTemplate jeecgElasticsearchTemplate;public void execute() throws InterruptedException {/* ------ es操作 ------- */String index = "qzt_index"; // 索引String type = "user"; // 类型JSONArray indices = jeecgElasticsearchTemplate.getIndices();log.info("获取es索引:[{}]",indices);JSONObject dataById = jeecgElasticsearchTemplate.getDataById(index, type, 1);log.info("根据ID获取文档数据:[{}]", dataById.toJSONString());/*JSONObject jsonObject = new JSONObject();jsonObject.put("name", "wanglili");jsonObject.put("age", 16);jsonObject.put("sex", 1);UUID uuid = UUID.randomUUID();jeecgElasticsearchTemplate.save(index, type, uuid.toString(),jsonObject);log.info("保存 id=[{}]", uuid.toString());*//* --------- es操作 ---------*/}public DemoLockTest() {}}

【http方式操作es】springboot整合es,轻量级不需要引入任何依赖相关推荐

  1. ElasticSearch系列 - SpringBoot整合ES:分析器

    文章目录 01. ElasticSearch 分析器 1. ElasticSearch match 文本搜索的过程? 2. ElasticSearch 分析器是什么? 3. ElasticSearch ...

  2. SpringBoot整合ES高级查询

    SpringBoot整合ES高级查询 springboot版本:2.0.5.RELEASE elasticsearch版本:7.9.1 1.配置 引入依赖: <dependency>< ...

  3. 用SpringBoot整合ES数据库基础

    一.SpringBoot整合ES数据库 1.配置原生的依赖. <properties><java.version>1.8</java.version><!-- ...

  4. ElasticSearch系列 - SpringBoot整合ES:短语匹配查询 match_phrase

    文章目录 1. ElasticSearch match_phrase查询是什么?它与match查询有什么区别? 2. ElasticSearch match_phrase 查询的语法是什么? 3. E ...

  5. ElasticSearch系列 - SpringBoot整合ES:多个精确值查询 terms

    文章目录 01. ElasticSearch terms 查询支持的数据类型 02. ElasticSearch term和 terms 查询的区别 03. ElasticSearch terms 查 ...

  6. Springboot整合ES

    本文来说下Springboot整合ES的实战部分 文章目录 概述 概述

  7. springboot整合es启动报错的问题

    今天打算用springboot整合es创建一个索引并往索引里面写数据的时候,项目启动的时候一直报下面的这个错误,错误大概如下, Caused by: org.springframework.beans ...

  8. Springboot整合ES,ES版不一致

    本文记录的是:在Springboot整合ES中遇到的一些事 问题描述 最近想要提升自己的能力(其实就是被逼无奈),去学习了Elasticsearch:官方分布式搜索和分析引擎,在学完基础知识后(其实就 ...

  9. SpringBoot整合es提示错误:ElasticsearchException[Invalid or missing build flavor [oss]]

    文章目录 解析 修改版本 错误详情 SpringBoot整合es提示错误:ElasticsearchException[Invalid or missing build flavor [oss]] 解 ...

  10. Elastic search入门到集群实战操作详解(原生API操作、springboot整合操作)-step1

    Elastic search入门到集群实战操作详解(原生API操作.springboot整合操作)-step2 https://blog.csdn.net/qq_45441466/article/de ...

最新文章

  1. 【 MATLAB 】离散傅里叶级数(DFS)与DFT、DTFT及 z变换之间的关系
  2. java导出生成word
  3. 作用域,上下文,闭包
  4. JVM之强引用、软引用、弱引用、虚引用
  5. leetcode(977)有序数组的平方
  6. [转载]《STL源码剖析》阅读笔记之 迭代器及traits编程技法
  7. 开启Nginx压缩,解决前端访问慢问题
  8. 【零基础学Java】—初识Java(一)
  9. 《跟小海龟学Python》部分案例视频集锦
  10. 编译qt的oracle驱动,怎样编译Qt下的Oracle驱动
  11. 用户控件中复杂属性的设计时支持
  12. phpcmsv9 更换域名出现页面无法访问后怎么办
  13. ipython怎么安装_如何装ipython
  14. 已知两边求角度公式_已知三边求角度公式
  15. 为什么“码农”需要自我营销?
  16. Loopback接口的主要作用
  17. html正则邮箱格式,JS正则表达式判断邮箱格式是否正确
  18. 微信小游戏之飞机大战解析
  19. Google Play_SDK(官方API)
  20. 计算机一分钟最快打多少字,世界上打字最快的人 马特斯科娃一分钟打多少字...

热门文章

  1. 《第16项目:国家税务协同平台项目》-视频目录
  2. 德国计划修订法案以获取社交媒体用户明文密码
  3. 浙江天搜科技鼓励员工创意 希望实现共同成长
  4. 计算机毕业设计(76)php小程序毕设作品之音频播放有声读物小程序系统
  5. AMBA AHB面试题连载(二)
  6. .net服务器报请求出错
  7. 几款实用的照片变漫画免费软件,千万别错过
  8. 知识图谱学习笔记(一)——知识图谱基础
  9. turtle安装以及python3安装报错解决方案,用python画小猪佩奇
  10. 怎样打开.mobi的后缀的文件?