java 封装ElasticsearchClient 8.X 基本操作方法
配置文件
<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 基本操作方法相关推荐
- java封装是什么_java封装是什么?Java面向对象的封装
java封装是什么? 在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部份包装.隐藏起来的方法. 封装可以被认为是一个保护屏障,防止该类的代码和数据 ...
- java封装的作用_Java的封装性
描述 封装性的概念与操作方法 封装性是面向对象思想的三大特征之一(其他两个特性是继承和多态). 封装就是隐藏实现细节,仅对外提供访问接口. 封装有:属性的封装.方法的封装.类的封装.组件的封装.模块化 ...
- Java封装OkHttp3工具类
点击关注公众号,Java干货及时送达 作者:如漩涡 https://blog.csdn.net/m0_37701381 Java封装OkHttp3工具类,适用于Java后端开发者 说实在话,用过挺多 ...
- Java:封装的概念,UML类图,构造方法,this关键字,static关键字,方法重载,包package
oop三大特性:封装,继承,多态 oop一般指面向对象程序设计(一种计算机编程架构) 一.封装的概念: 将东西包在一起,然后以新的完整形式呈现出来 ...
- 基于java封装的语言_封装在java中的应用
封装在java中的应用 发布时间:2020-07-01 11:53:47 来源:亿速云 阅读:92 作者:Leah 本篇文章给大家分享的是有关封装在java中的应用,小编觉得挺实用的,因此分享给大家学 ...
- java dsp_GitHub - Onemeaning/JavaDsp: 数字信号处理(DSP)方面的Java封装,包含常用的一些处理方法,如滤波、信号变换等等。...
JavaDsp 数字信号处理(DSP)方面的Java封装,包含常用的一些处理方法,如滤波.信号变换等等. 该类库是我本科毕业设计中的一部分,绝大部分都是我自己写实现的,很少部分算法有我另外几个朋友参与 ...
- java封装原则_跟我学java编程—理解Java面向对象的封装原则
前面一节内容讲到了抽象与对象,抽象是把同类事物的共同特征抽取出来归纳为类,类的具体实例为对象.例如:把具有汁液多.糖分多.含有挥发性芳香物质.可以生食等特征的事物归纳为水果类,苹果.葡萄.生梨则为水果 ...
- java 集成 v8_J2V8首页、文档和下载 - V8 的 Java 封装版本
J2V8 是 V8 引擎的 Java 封装版本,注重性能和紧密集成. 示例代码:V8 v8 = V8.createV8Runtime(); V8Array result = v8.executeArr ...
- leveldb java实例_EZDB首页、文档和下载 - LevelDB 的 Java 封装 - OSCHINA - 中文开源技术交流社区...
EZDB 为 LevelDB 提供一个很好的 Java 封装. 功能包括:Key/value 查询 Hash/range 查询 (类似 Amazon 的 DynamoDB) 可插入式的序列化 可插入式 ...
最新文章
- Error: No controllers detected :问题解决
- 互联网1分钟 |0102
- android 回调函数一:基本概念
- 包邮送50本畅销书,涵盖Python、数据库、机器学习等!
- TOJ5398: 签到大富翁(简单模拟) and TOJ 5395: 大于中值的边界元素(数组的应用)...
- RPC 和 RESTful对比
- 无字库12864液晶屏滚动显示程序[转]
- 雅虎JavaScript架构师:网页开发技术安全优先
- oracle避免索引失效,Oracle优化你的查询--关于避免索引隐式失效
- 搭建一个tomcat的JSP服务器环境
- 用matlab进行拉普拉斯滤波,[转载]matlab滤波技术及区域处理---线性滤波
- 计算机怎么删除我的苹果设备管理器,itunes安装和卸载教程 如何完整删除iTunes 组件...
- 【SLAM学习笔记】10-ORB_SLAM3关键源码分析⑧ Optimizer(五)sim3优化
- 整理归纳:《一课经济学》—— 只见树木不见森林
- Hive窗口函数之preceding and following
- WebWork深度探索之Pitfall
- win7系统访问局域网中的wamp服务器
- 华为物联网(IOT)开发者平台
- 基于树莓派4b(raspberry pi 4b)内核编译流程,交叉编译环境搭建,loadable kernel module (LKM)编译方法
- MySQL数据库从入门到入土!
热门文章
- 在VS2017上配置Opencv342(完整配置过程)
- 车身域控制器(BDCU)
- 修改注册表导致无法登录到你的账户
- Java 学习之路 重写父类方法
- OKR让Z世代员工更创新,更努力
- ### Cause: java.lang.IllegalStateException: Cannot enable lazy loading because Javassist is not avai
- 新科技在什么时候才能带来价值
- windows远程桌面 身份验证错误:要求的函数不正确等解决办法
- 二、工厂模式——在工厂里能找到你的对象
- Java为啥不建议用通配符_java – 为什么要使用通配符捕获辅助方法?