配置文件

        <dependency><groupId>co.elastic.clients</groupId><artifactId>elasticsearch-java</artifactId><version>8.3.3</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.12.3</version></dependency><dependency><groupId>jakarta.json.bind</groupId><artifactId>jakarta.json.bind-api</artifactId><version>2.0.0</version></dependency><dependency><groupId>jakarta.json</groupId><artifactId>jakarta.json-api</artifactId><version>2.0.1</version></dependency>

1.建立工厂


import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import co.elastic.clients.transport.ElasticsearchTransport;
import co.elastic.clients.transport.rest_client.RestClientTransport;
import org.apache.commons.pool2.PooledObject;
import org.apache.commons.pool2.PooledObjectFactory;
import org.apache.commons.pool2.impl.DefaultPooledObject;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;public class EsClientPoolFactory implements PooledObjectFactory<ElasticsearchClient> {@Overridepublic PooledObject<ElasticsearchClient> makeObject() throws Exception {String esServerHosts ="127.0.0.1:9200";List<HttpHost> httpHosts = new ArrayList<>();//填充数据List<String> hostList = Arrays.asList(esServerHosts.split(","));for (int i = 0; i < hostList.size(); i++) {String host = hostList.get(i);httpHosts.add(new HttpHost(host.substring(0, host.indexOf(":")), Integer.parseInt(host.substring(host.indexOf(":") + 1)), "http"));}// 创建低级客户端RestClient restClient = RestClient.builder(httpHosts.toArray(new HttpHost[0])).build();//使用Jackson映射器创建传输层ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());ElasticsearchClient client = new ElasticsearchClient(transport);//log.info("对象被创建了" + client);return new DefaultPooledObject<>(client);}@Overridepublic void destroyObject(PooledObject<ElasticsearchClient> p) throws Exception {ElasticsearchClient elasticsearchClient = p.getObject();//log.info("对象被销毁了" + elasticsearchClient);}@Overridepublic boolean validateObject(PooledObject<ElasticsearchClient> p) {return true;}@Overridepublic void activateObject(PooledObject<ElasticsearchClient> p) throws Exception {//log.info("对象被激活了" + p.getObject());}@Overridepublic void passivateObject(PooledObject<ElasticsearchClient> p) throws Exception {//log.info("对象被钝化了" + p.getObject());}
}

2.建立连接


import co.elastic.clients.elasticsearch.ElasticsearchClient;
import org.apache.commons.pool2.impl.GenericObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class ESClientPool {private static Logger logger = LoggerFactory.getLogger(ESClientPool.class);// 对象池配置类,不写也可以,采用默认配置private static GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();// 采用默认配置maxTotal是8,池中有8个clientstatic {poolConfig.setMaxIdle(200);poolConfig.setMaxTotal(20);poolConfig.setMinEvictableIdleTimeMillis(1000L*3L);}// 要池化的对象的工厂类,这个是我们要实现的类private static EsClientPoolFactory esClientPoolFactory = new EsClientPoolFactory();// 利用对象工厂类和配置类生成对象池private static GenericObjectPool<ElasticsearchClient> clientPool = new GenericObjectPool<>(esClientPoolFactory, poolConfig);/*** 获得对象** @return* @throws Exception*/public static ElasticsearchClient getClient() throws Exception {ElasticsearchClient client = clientPool.borrowObject();logger.info("从池中取一个对象"+client);return client;}/*** 归还对象** @param client*/public static void returnClient(ElasticsearchClient client) throws Exception {logger.info("使用完毕之后,归还对象"+client);clientPool.returnObject(client);}}

3.创建索引服务接口

    /*** 创建索引** @param indexName* @return* @throws Exception*/@ApiOperation(value = "创建索引服务接口")@PostMapping("/createIndex")public boolean createIndex(@RequestParam("indexName") String indexName) {try {ElasticsearchClient client = ESClientPool.getClient();//创建索引并返回状态CreateIndexResponse createIndexResponse = client.indices().create(c -> c.index(indexName));Boolean acknowledged = createIndexResponse.acknowledged();System.out.println("acknowledged = " + acknowledged);ESClientPool.returnClient(client);return acknowledged;} catch (Exception e) {e.printStackTrace();}return false;}

4.删除索引服务接口

    /*** 删除索引服务接口** @return*/@ApiOperation(value = "删除索引服务接口")@DeleteMapping("/deleteIndex/{indexName}")public boolean deleteIndex(@PathVariable("indexName") String indexName) {try {ElasticsearchClient client = ESClientPool.getClient();boolean exists = exists(client, Arrays.asList(indexName));if (!exists) {//不存在就结束return false;}DeleteIndexResponse deleteIndexResponse = client.indices().delete(index -> index.index(indexName));boolean acknowledged = deleteIndexResponse.acknowledged();ESClientPool.returnClient(client);System.out.println("acknowledged = " + acknowledged);return acknowledged;} catch (Exception e) {e.printStackTrace();}return false;}//检验索引是否存在public boolean exists(ElasticsearchClient client, List<String> indexName) {try {boolean value = client.indices().exists(e -> e.index(indexName)).value();System.out.println("indexexists:  " + value);return value;} catch (IOException e) {e.printStackTrace();}return false;}

5.查看索引信息服务接口

    /*** 查看索引信息** @param indexName* @return* @throws Exception*/@ApiOperation(value = "查看索引信息服务接口")@GetMapping("/getIndex")public Map<String, Object> getIndexMsg(@RequestParam("indexName") String indexName) {try {Map<String, Object> map = new HashMap<>();ElasticsearchClient client = ESClientPool.getClient();GetIndexResponse getIndexResponse = client.indices().get(getIndex -> getIndex.index(indexName));Map<String, IndexState> result = getIndexResponse.result();ESClientPool.returnClient(client);map.put("data", result.toString());return map;} catch (Exception e) {e.printStackTrace();}return null;}

6.索引存在校验服务接口

    /*** 索引是否存在** @param indexName* @return*/@ApiOperation(value = "索引存在校验服务接口")@GetMapping("/checkIndex")public boolean exists(@RequestParam("indexName") String indexName) {try {ElasticsearchClient client = ESClientPool.getClient();boolean value = client.indices().exists(e -> e.index(indexName)).value();System.out.println("indexexists:  " + value);ESClientPool.returnClient(client);return value;} catch (Exception e) {e.printStackTrace();}return false;}

7.批量添加文档信息

//请求实体类import com.es.esdemo.commons.entity.UserDO;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;import java.io.Serializable;
import java.util.List;@Data
public class UserRequestDTO implements Serializable {@ApiModelProperty("索引")private String index;@ApiModelProperty("数据集合")private List<UserDO> userList;@ApiModelProperty("数据ids")private List<String> ids;
}//用户实体类
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;import java.io.Serializable;@Data
public class UserDO implements Serializable {@ApiModelProperty("用户id")private String id;@ApiModelProperty("姓名")private String name;@ApiModelProperty("性别")private String sex;@ApiModelProperty("年龄")private Integer age;@ApiModelProperty("索引")private String index;@ApiModelProperty("实体类")private Object obj;}/*** 添加文档信息*/@ApiOperation(value = "添加文档信息服务接口")@PostMapping("/addDocuments")public long createDocument(@RequestBody UserRequestDTO dto) {try {ElasticsearchClient client = ESClientPool.getClient();IndexResponse indexResponse = client.index(x -> x.index(dto.getIndex()).document(dto.getUserList().get(0)));long version = indexResponse.version();ESClientPool.returnClient(client);return version;} catch (Exception e) {e.printStackTrace();}return 0;}

8.更新文档信息服务接口

    /*** 修改文档自定义属性** @return version* @throws Exception*/@ApiOperation(value = "更新文档信息服务接口")@PostMapping("/updateDocuments")public long updateDocument(@RequestBody UserRequestDTO dto) {try {ElasticsearchClient client = ESClientPool.getClient();UpdateResponse<UserDO> userUpdateResponse = client.update(x -> x.index(dto.getIndex()).id(dto.getUserList().get(0).getId()).doc(dto.getUserList().get(0)), UserDO.class);long version = userUpdateResponse.version();ESClientPool.returnClient(client);return version;} catch (Exception e) {e.printStackTrace();}return 0;}

9.批量删除文档

 /*** bulk批量删除文档记录** @return List<BulkResponseItem>* @throws Exception*/@ApiOperation(value = "批量删除文档信息服务接口")@DeleteMapping("/batchDeleteDocuments")public List<BulkResponseItem> delDocByIds(UserRequestDTO dto) {try {ElasticsearchClient client = ESClientPool.getClient();// 构建批量操作对象BulkOperation的集合List<BulkOperation> bulkOperations = new ArrayList<>();// 向集合中添加需要删除的文档id信息for (int i = 0; i < dto.getIds().size(); i++) {int finalI = i;bulkOperations.add(BulkOperation.of(b -> b.delete((d -> d.index(dto.getIndex()).id(dto.getIds().get(finalI))))));}// 调用客户端的bulk方法,并获取批量操作响应结果BulkResponse response = client.bulk(e -> e.index(dto.getIndex()).operations(bulkOperations));return response.items();} catch (Exception e) {e.printStackTrace();}return null;}

10.高亮 自定义颜色

    /*** 高亮 自定义颜色** @param index 索引* @param field 字段* @param value 参数* @param color 颜色 (支持rgb格式颜色)* @return* @throws Exception*/@ApiOperation(value = "自定义高亮查询 自定义颜色不填默认黄色")@PostMapping("/advancedQueryByHighLightColor")public Object advancedQueryByHighLightColor(String index, String field, String value, String color) throws Exception {ElasticsearchClient client = ESClientPool.getClient();SearchResponse<Object> searchResponse = client.search(e -> e.index(index).query(q -> q.term(t -> t.field(field).value(value))).highlight(h -> h.fields(field, f -> f.preTags("<font color='" + (StringUtils.isEmpty(color) ? "yellow" : color) + "'>").postTags("</font>"))), Object.class);Object source = searchResponse.hits().hits();ESClientPool.returnClient(client);return source.toString();}

11.文档查询(相当于mysql in 方法)

    /*** term匹配 多次匹配** @param index* @param field       字段* @param fieldValues 多个参数相当于 mysql in语法* @return Object* @throws Exception*/@ApiOperation(value = "term匹配 多次匹配")@PostMapping("/advancedQueryByTerms")public Object advancedQueryByTerms(String index, String field, List<FieldValue> fieldValues) throws Exception {ElasticsearchClient client = ESClientPool.getClient();SearchResponse<Object> user_test = client.search(e -> e.index(index).query(q -> q.terms(t -> t.field(field).terms(terms -> terms.value(fieldValues)))), Object.class);HitsMetadata<Object> hits = user_test.hits();TotalHits total = hits.total();List<Hit<Object>> hits1 = hits.hits();Object source = hits1.get(0).source();ESClientPool.returnClient(client);return source;}

12.分页查询

    /*** 分页查询** @param index 索引* @param from  页数* @param size  条数* @return* @throws Exception*/@ApiOperation(value = "分页查询")@PostMapping("/advancedQueryByPage")public Object advancedQueryByPage(String index, Integer from, Integer size) throws Exception {ElasticsearchClient client = ESClientPool.getClient();SearchResponse<Object> searchResponse = client.search(e -> e.index(index).query(q -> q.matchAll(m -> m)).from(from).size(size), Object.class);Object source = searchResponse.hits().hits().get(0).source();ESClientPool.returnClient(client);return source;}

13.match 匹配 文档类型为text会自动分词,默认keyword字段不支持分词

/*** match 匹配 文档类型为text会自动分词,默认keyword字段不支持分词** @param indexName 索引* @param field     查询字段* @param query     查询内容* @param slop      间隔字符数量* @param sortField 排序字段* @param order     排序方式* @param from      页数* @param size      条数* @return* @throws Exception*/@ApiOperation(value = "中文分词查询 (文档类型为text会自动分词,默认keyword字段不支持分词)")@PostMapping("/queryMatch")public Object queryMatch(String indexName, String field, String query, Integer slop, Integer from, Integer size) throws Exception {ElasticsearchClient client = ESClientPool.getClient();SearchResponse<Object> searchResponse = client.search(e -> e.index(indexName).query(q -> q.matchPhrase(m -> m.field(field).query(query).slop(slop))).from(from).size(size), Object.class);Object source = searchResponse.hits().hits().get(0).source();ESClientPool.returnClient(client);return source;}

14.matchPhrasePrefix 分词匹配

    /*** matchPhrase短语匹配** @param indexName 索引* @param field     查询字段* @param query     查询内容* @param slop      间隔字符数量* @param sortField 排序字段* @param order     排序方式* @param from      页数* @param size      条数* @return* @throws Exception*/@ApiOperation(value = "拼音分词查询 (索引需要加上 analysis 配置才能生效)")@PostMapping("/matchPhrasePrefix")public Object matchPhrasePrefix(String indexName, String field, String query, Integer slop,  Integer from, Integer size) throws Exception {ElasticsearchClient client = ESClientPool.getClient();SearchResponse<Object> searchResponse = client.search(e -> e.index(indexName).query(q -> q.matchPhrasePrefix(m -> m.field(field).query(query).slop(slop))).from(from).size(size), Object.class);Object source = searchResponse.hits().hits();ESClientPool.returnClient(client);return source;}/*** 需要使用此项配置才能生效拼音分词查询* PUT /milk* {*   "settings": {*     "analysis": {*       "filter": {*         "pinyin_filter":{*           "type":"pinyin",*           "keep_separate_first_letter" : false,*           "keep_full_pinyin" : true,*           "keep_original" : true,*           "limit_first_letter_length" : 16,*           "lowercase" : true,*           "remove_duplicated_term" : true* }*       },*       "analyzer": {*         "ik_pinyin_analyzer":{*           "tokenizer":"standard",*            "filter":["pinyin_filter"]*         }*       }*     }*   },*   "mappings": {*     "properties": {*       "brand":{*         "type": "text",*         "analyzer": "ik_pinyin_analyzer"*       },*       "series":{*         "type": "text",*         "analyzer": "ik_pinyin_analyzer"*       },*       "price":{*         "type": "float"*       }*     }*   }* }** POST _bulk* {"index":{"_index":"milk", "_id":1}}* {"brand":"蒙牛", "series":"特仑苏", "price":60}* {"index":{"_index":"milk", "_id":2}}* {"brand":"蒙牛", "series":"真果粒", "price":40}* {"index":{"_index":"milk", "_id":3}}* {"brand":"华山牧", "series":"华山牧", "price":49.90}* {"index":{"_index":"milk", "_id":4}}* {"brand":"伊利", "series":"安慕希", "price":49.90}* {"index":{"_index":"milk", "_id":5}}* {"brand":"伊利", "series":"金典", "price":49.90}** POST milk/_search* {**   "query": {*     "match_phrase_prefix": {*       "series": "l"*     }*   }* }*/

java 封装ElasticsearchClient 8.X 基本操作方法相关推荐

  1. java封装是什么_java封装是什么?Java面向对象的封装

    java封装是什么? 在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部份包装.隐藏起来的方法. 封装可以被认为是一个保护屏障,防止该类的代码和数据 ...

  2. java封装的作用_Java的封装性

    描述 封装性的概念与操作方法 封装性是面向对象思想的三大特征之一(其他两个特性是继承和多态). 封装就是隐藏实现细节,仅对外提供访问接口. 封装有:属性的封装.方法的封装.类的封装.组件的封装.模块化 ...

  3. Java封装OkHttp3工具类

    点击关注公众号,Java干货及时送达  作者:如漩涡 https://blog.csdn.net/m0_37701381 Java封装OkHttp3工具类,适用于Java后端开发者 说实在话,用过挺多 ...

  4. Java:封装的概念,UML类图,构造方法,this关键字,static关键字,方法重载,包package

                     oop三大特性:封装,继承,多态 oop一般指面向对象程序设计(一种计算机编程架构) 一.封装的概念:    将东西包在一起,然后以新的完整形式呈现出来       ...

  5. 基于java封装的语言_封装在java中的应用

    封装在java中的应用 发布时间:2020-07-01 11:53:47 来源:亿速云 阅读:92 作者:Leah 本篇文章给大家分享的是有关封装在java中的应用,小编觉得挺实用的,因此分享给大家学 ...

  6. java dsp_GitHub - Onemeaning/JavaDsp: 数字信号处理(DSP)方面的Java封装,包含常用的一些处理方法,如滤波、信号变换等等。...

    JavaDsp 数字信号处理(DSP)方面的Java封装,包含常用的一些处理方法,如滤波.信号变换等等. 该类库是我本科毕业设计中的一部分,绝大部分都是我自己写实现的,很少部分算法有我另外几个朋友参与 ...

  7. java封装原则_跟我学java编程—理解Java面向对象的封装原则

    前面一节内容讲到了抽象与对象,抽象是把同类事物的共同特征抽取出来归纳为类,类的具体实例为对象.例如:把具有汁液多.糖分多.含有挥发性芳香物质.可以生食等特征的事物归纳为水果类,苹果.葡萄.生梨则为水果 ...

  8. java 集成 v8_J2V8首页、文档和下载 - V8 的 Java 封装版本

    J2V8 是 V8 引擎的 Java 封装版本,注重性能和紧密集成. 示例代码:V8 v8 = V8.createV8Runtime(); V8Array result = v8.executeArr ...

  9. leveldb java实例_EZDB首页、文档和下载 - LevelDB 的 Java 封装 - OSCHINA - 中文开源技术交流社区...

    EZDB 为 LevelDB 提供一个很好的 Java 封装. 功能包括:Key/value 查询 Hash/range 查询 (类似 Amazon 的 DynamoDB) 可插入式的序列化 可插入式 ...

最新文章

  1. Error: No controllers detected :问题解决
  2. 互联网1分钟 |0102
  3. android 回调函数一:基本概念
  4. 包邮送50本畅销书,涵盖Python、数据库、机器学习等!
  5. TOJ5398: 签到大富翁(简单模拟) and TOJ 5395: 大于中值的边界元素(数组的应用)...
  6. RPC 和 RESTful对比
  7. 无字库12864液晶屏滚动显示程序[转]
  8. 雅虎JavaScript架构师:网页开发技术安全优先
  9. oracle避免索引失效,Oracle优化你的查询--关于避免索引隐式失效
  10. 搭建一个tomcat的JSP服务器环境
  11. 用matlab进行拉普拉斯滤波,[转载]matlab滤波技术及区域处理---线性滤波
  12. 计算机怎么删除我的苹果设备管理器,itunes安装和卸载教程 如何完整删除iTunes 组件...
  13. 【SLAM学习笔记】10-ORB_SLAM3关键源码分析⑧ Optimizer(五)sim3优化
  14. 整理归纳:《一课经济学》—— 只见树木不见森林
  15. Hive窗口函数之preceding and following
  16. WebWork深度探索之Pitfall
  17. win7系统访问局域网中的wamp服务器
  18. 华为物联网(IOT)开发者平台
  19. 基于树莓派4b(raspberry pi 4b)内核编译流程,交叉编译环境搭建,loadable kernel module (LKM)编译方法
  20. MySQL数据库从入门到入土!

热门文章

  1. 在VS2017上配置Opencv342(完整配置过程)
  2. 车身域控制器(BDCU)
  3. 修改注册表导致无法登录到你的账户
  4. Java 学习之路 重写父类方法
  5. OKR让Z世代员工更创新,更努力
  6. ### Cause: java.lang.IllegalStateException: Cannot enable lazy loading because Javassist is not avai
  7. 新科技在什么时候才能带来价值
  8. windows远程桌面 身份验证错误:要求的函数不正确等解决办法
  9. 二、工厂模式——在工厂里能找到你的对象
  10. Java为啥不建议用通配符_java – 为什么要使用通配符捕获辅助方法?