Java封装原生ES

文章目录

  • 🌞 Sun Frame:SpringBoot 的轻量级开发框架(个人开源项目推荐)
    • 🌟 亮点功能
    • 📦 spring cloud模块概览
      • 常用工具
    • 🔗 更多信息
    • 1.spring-data-es操作ES
        • 1.引入依赖
        • 2.application.yml配置uris
        • 3.SubjectInfoEs.java 创建ES实体类(指定映射和索引)
        • 4.SubjectEsRepository.java 依赖注入一个接口(对应于实体类)
        • 5.SubjectEsService.java
        • 6.SubjectEsServiceImpl.java
        • 7.TestFeignController.java 测试
        • 8.测试
          • 1.请求,注意要加上loginId因为没走网关,不加就会空指针
        • 9.添加文档
          • 1.SubjectEsService.java
          • 2.SubjectEsServiceImpl.java
          • 3.TestFeignController.java
          • 4.测试
        • 10.查找文档
          • 1.SubjectEsService.java
          • 2.SubjectEsServiceImpl.java
          • 3.TestFeignController.java
          • 4.测试
    • 2.自定义封装ES
        • 1.环境准备
          • 1.删除上面引入的ES依赖
          • 2.删除application.yml中的ES配置
          • 3.删除原来的文件
          • 4.sun-club-infra 引入原生的ES依赖
        • 2.自定义封装集群es连接统一管理
          • 1.目录结构
          • 2.EsClusterConfig.java ES的集群配置的实体类
          • 3.EsConfigProperties.java 读取配置文件的es集群配置
          • 3.编写配置文件
          • 4.EsRestClient.java Es工具类,将每个集群节点对应的某个客户端放到Map
          • 5.启动测试,可以读取到配置信息
        • 3.封装ES常用操作(全)
          • 1.EsClusterConfig.java ES的集群配置的实体类
          • 2.EsConfigProperties.java 读取配置文件的集群配置
          • 3.EsIndexInfo.java Es的索引信息
          • 4.EsSourceData.java Es源数据
          • 5.EsSearchRequest.java Es查询的请求实体类
          • 6.EsRestClient.java
          • 7.配置文件和依赖同上

🌞 Sun Frame:SpringBoot 的轻量级开发框架(个人开源项目推荐)

Sun Frame Banner

轻松高效的现代化开发体验

Sun Frame 是我个人开源的一款基于 SpringBoot 的轻量级框架,专为中小型企业设计。它提供了一种快速、简单且易于扩展的开发方式。

我们的开发文档记录了整个项目从0到1的任何细节,实属不易,请给我们一个Star!🌟
您的支持是我们持续改进的动力。

🌟 亮点功能

  • 组件化开发:灵活选择,简化流程。
  • 高性能:通过异步日志和 Redis 缓存提升性能。
  • 易扩展:支持多种数据库和消息队列。

📦 spring cloud模块概览

  • Nacos 服务:高效的服务注册与发现。
  • Feign 远程调用:简化服务间通信。
  • 强大网关:路由与限流。

常用工具

  • 日志管理:异步处理与链路追踪。
  • Redis 集成:支持分布式锁与缓存。
  • Swagger 文档:便捷的 API 入口。
  • 测试支持:SpringBoot-Test 集成。
  • EasyCode:自定义EasyCode模板引擎,一键生成CRUD。

🔗 更多信息

  • 开源地址:Gitee Sun Frame
  • 详细文档:语雀文档
    在这里插入图片描述

1.spring-data-es操作ES

1.引入依赖
<!-- ES -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId><version>2.4.2</version>
</dependency>
2.application.yml配置uris
3.SubjectInfoEs.java 创建ES实体类(指定映射和索引)
package com.sunxiansheng.subject.infra.basic.entity;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;import java.util.Date;/*** Description: 题目ES,相当于db中的表结构* @Author sun* @Create 2024/6/17 16:01* @Version 1.0*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Document(indexName = "subject_index", createIndex = false) // 指定索引名,这里的createIndex=true,默认自动创建索引
public class SubjectInfoEs {// 使用es必须的@Field(type = FieldType.Long)@Idprivate Long id;@Field(type = FieldType.Text, analyzer = "ik_smart")private String subjectName;@Field(type = FieldType.Text, analyzer = "ik_smart")private String subjectAnswer;@Field(type = FieldType.Text, analyzer = "ik_smart")private String createUser;@Field(type = FieldType.Date, index = false)private Date createTime;
}
4.SubjectEsRepository.java 依赖注入一个接口(对应于实体类)
package com.sunxiansheng.subject.infra.basic.esRepo;import com.sunxiansheng.subject.infra.basic.entity.SubjectInfoEs;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Component;/*** Description:* @Author sun* @Create 2024/6/17 16:09* @Version 1.0*/
@Component
public interface SubjectEsRepository extends ElasticsearchRepository<SubjectInfoEs, Long> {}
5.SubjectEsService.java
package com.sunxiansheng.subject.infra.basic.service;/*** Description:* @Author sun* @Create 2024/6/17 16:11* @Version 1.0*/
public interface SubjectEsService {void createIndex();void getDocs();void find();void search();
}
6.SubjectEsServiceImpl.java
package com.sunxiansheng.subject.infra.basic.service.impl;import com.sunxiansheng.subject.infra.basic.entity.SubjectInfoEs;
import com.sunxiansheng.subject.infra.basic.service.SubjectEsService;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.IndexOperations;
import org.springframework.data.elasticsearch.core.document.Document;
import org.springframework.stereotype.Service;import javax.annotation.Resource;/*** Description:* @Author sun* @Create 2024/6/17 16:12* @Version 1.0*/
@Service
public class SubjectEsServiceImpl implements SubjectEsService {@Resourceprivate ElasticsearchRestTemplate elasticsearchRestTemplate;/*** 创建索引*/@Overridepublic void createIndex() {// 得到ES实体类中的索引信息然后创建IndexOperations indexOperations = elasticsearchRestTemplate.indexOps(SubjectInfoEs.class);// 创建索引indexOperations.create();// 绑定映射Document mapping = indexOperations.createMapping(SubjectInfoEs.class);indexOperations.putMapping(mapping);}/****/@Overridepublic void getDocs() {}@Overridepublic void find() {}@Overridepublic void search() {}
}
7.TestFeignController.java 测试

image-20240617163237070

8.测试
1.请求,注意要加上loginId因为没走网关,不加就会空指针

image-20240617163558768

9.添加文档
1.SubjectEsService.java
void addDocs();
2.SubjectEsServiceImpl.java

image-20240617164738844

/*** 添加文档,也就相当于添加一条数据*/
@Override
public void addDocs() {List<SubjectInfoEs> list = new LinkedList<>();// 添加两条数据list.add(new SubjectInfoEs(1L, "Java", "Java", "sun", null));list.add(new SubjectInfoEs(2L, "Spring", "Spring", "sun", null));// 批量添加subjectEsRepository.saveAll(list);
}
3.TestFeignController.java
@RequestMapping("/addDocs")
public void createaddDocsIndex() {subjectEsService.addDocs();
}
4.测试

image-20240617164759151

image-20240617164823117

10.查找文档
1.SubjectEsService.java
void find();
2.SubjectEsServiceImpl.java
/*** 查找列对应的元素*/
@Override
public void find() {NativeSearchQuery nativeSearchQuery = new NativeSearchQueryBuilder().withQuery(QueryBuilders.matchQuery("subjectName", "Java")).build();SearchHits<SubjectInfoEs> search = elasticsearchRestTemplate.search(nativeSearchQuery, SubjectInfoEs.class);List<SearchHit<SubjectInfoEs>> searchHits = search.getSearchHits();log.info("searchHits:{}", searchHits);}
3.TestFeignController.java
@RequestMapping("/find")
public void find() {subjectEsService.find();
}
4.测试

image-20240617165534922

image-20240617165627333

2.自定义封装ES

1.环境准备
1.删除上面引入的ES依赖
2.删除application.yml中的ES配置
3.删除原来的文件
4.sun-club-infra 引入原生的ES依赖
<!-- 封装自定义ES -->
<dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>7.5.2</version>
</dependency>
<dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-client</artifactId><version>7.5.2</version>
</dependency>
<dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.5.2</version>
</dependency>
<!-- 集合工具类,配合封装自定义ES -->
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-collections4</artifactId><version>4.4</version>
</dependency>
2.自定义封装集群es连接统一管理
1.目录结构

image-20240618174602620

2.EsClusterConfig.java ES的集群配置的实体类
package com.sunxiansheng.subject.infra.basic.es;import lombok.Data;import java.io.Serializable;/*** Description: ES的集群配置的实体类* @Author sun* @Create 2024/6/17 17:08* @Version 1.0*/
@Data
public class EsClusterConfig implements Serializable {/*集群名称*/private String name;/*集群节点*/private String nodes;
}
3.EsConfigProperties.java 读取配置文件的es集群配置
package com.sunxiansheng.subject.infra.basic.es;import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;import java.util.ArrayList;
import java.util.List;/*** Description: 读取配置文件的集群配置* @Author sun* @Create 2024/6/17 17:10* @Version 1.0*/
@Component
@ConfigurationProperties(prefix = "es.cluster") // 这个就相当于将esConfigs对应于配置文件的es.cluster.esConfigs
public class EsConfigProperties {private List<EsClusterConfig> esConfigs = new ArrayList<>();public List<EsClusterConfig> getEsConfigs() {return esConfigs;}public void setEsConfigs(List<EsClusterConfig> esConfigs) {this.esConfigs = esConfigs;}
}
3.编写配置文件
es:cluster:es-configs[0]:name: 98bd89b5ccafnodes: ip:9200
4.EsRestClient.java Es工具类,将每个集群节点对应的某个客户端放到Map
package com.sunxiansheng.subject.infra.basic.es;import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.math.NumberUtils;
import org.apache.http.HttpHost;
import org.apache.http.client.methods.HttpPost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** Description: Es工具类* @Author sun* @Create 2024/6/17 17:43* @Version 1.0*/
@Component
@Slf4j
public class EsRestClient {/*表示某个集群节点对应的某个客户端的mapRestHighLevelClient:是由集群的ip端口数组生成的*/public static Map<String, RestHighLevelClient> clientMap = new HashMap<>();/*获取配置文件中填写的es.cluster.es-configs的集群信息*/@Resourceprivate EsConfigProperties esConfigProperties;/*** @PostConstruct:注解用于标记一个方法,该方法会在依赖注入完成后自动调用* 这里将从配置文件中读取的集群信息封装到map中*/@PostConstructpublic void initialize() {// 获取集群节点的信息List<EsClusterConfig> esConfigs = esConfigProperties.getEsConfigs();esConfigs.forEach(esClusterConfig -> {String name = esClusterConfig.getName();String nodes = esClusterConfig.getNodes();log.info("initialize.esClusterConfig.name:{},nodes:{}", name, nodes);// 将每个集群的ip端口数组转换为RestHighLevelClientRestHighLevelClient restHighLevelClient = initRestClient(esClusterConfig);if (restHighLevelClient != null) {// 如果不为空就放到clientMap中clientMap.put(name, restHighLevelClient);} else {// 如果为空,打印日志log.error("initialize.esClusterConfig.name:{},nodes:{} is null", name, nodes);}});}/*** 通过一个集群节点来初始化该集群节点对应的客户端* @param esClusterConfig* @return*/private RestHighLevelClient initRestClient(EsClusterConfig esClusterConfig) {// 得到该集群节点的IP端口数组String[] ipPortArr = esClusterConfig.getNodes().split(",");// 初始化一个HttpHost的列表List<HttpHost> httpHostList = new ArrayList<>(ipPortArr.length);// 对每一个ip端口进行处理for (String ipPort : ipPortArr) {// 分割ip端口String[] ipPortInfo = ipPort.split(":");// 校验if (ipPortInfo.length == 2) {// 创建一个HttpPost的对象,存放ip和端口HttpHost httpHost = new HttpHost(ipPortInfo[0], NumberUtils.toInt(ipPortInfo[1]));// 放到list中httpHostList.add(httpHost);}}// 创建一个HttpHost的数组,存放HttpHostHttpHost[] httpHosts = new HttpHost[httpHostList.size()];// httpHostList的数据放到这个数组里httpHostList.toArray(httpHosts);// 得到RestClientRestClientBuilder builder = RestClient.builder(httpHosts);// 升级一下RestHighLevelClient restHighLevelClient = new RestHighLevelClient(builder);return restHighLevelClient;}}
5.启动测试,可以读取到配置信息
3.封装ES常用操作(全)
1.EsClusterConfig.java ES的集群配置的实体类
package com.sunxiansheng.subject.infra.basic.es;import lombok.Data;import java.io.Serializable;/*** Description: ES的集群配置的实体类* @Author sun* @Create 2024/6/17 17:08* @Version 1.0*/
@Data
public class EsClusterConfig implements Serializable {/*集群名称*/private String name;/*集群节点*/private String nodes;
}
2.EsConfigProperties.java 读取配置文件的集群配置
package com.sunxiansheng.subject.infra.basic.es;import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;import java.util.ArrayList;
import java.util.List;/*** Description: 读取配置文件的集群配置* @Author sun* @Create 2024/6/17 17:10* @Version 1.0*/
@Component
@ConfigurationProperties(prefix = "es.cluster") // 这个就相当于将esConfigs对应于配置文件的es.cluster.esConfigs
public class EsConfigProperties {private List<EsClusterConfig> esConfigs = new ArrayList<>();public List<EsClusterConfig> getEsConfigs() {return esConfigs;}public void setEsConfigs(List<EsClusterConfig> esConfigs) {this.esConfigs = esConfigs;}
}
3.EsIndexInfo.java Es的索引信息
package com.sunxiansheng.subject.infra.basic.es;import lombok.Data;import java.io.Serializable;/*** Description: Es的索引信息* @Author sun* @Create 2024/6/17 17:17* @Version 1.0*/
@Data
public class EsIndexInfo implements Serializable {/*集群名称*/private String clusterName;/*索引名称*/private String indexName;}
4.EsSourceData.java Es源数据
package com.sunxiansheng.subject.infra.basic.es;import lombok.Data;import java.io.Serializable;
import java.util.Map;/*** Description: Es源数据* @Author sun* @Create 2024/6/17 17:41* @Version 1.0*/
@Data
public class EsSourceData implements Serializable {private String docId;private Map<String, Object> data;}
5.EsSearchRequest.java Es查询的请求实体类
package com.sunxiansheng.subject.infra.basic.es;import lombok.Data;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.sort.SortOrder;/*** Description: Es查询的请求实体类* @Author sun* @Create 2024/6/17 17:20* @Version 1.0*/
@Data
public class EsSearchRequest {/*** 查询条件*/private BoolQueryBuilder bq;/*** 查询字段*/private String[] fields;/*** 页数*/private int from;/*** 条数*/private int size;/*** 需要快照*/private Boolean needScroll;/*** 快照缓存时间*/private Long minutes;/*** 排序字段*/private String sortName;/*** 排序类型*/private SortOrder sortOrder;/*** 高亮builder*/private HighlightBuilder highlightBuilder;}
6.EsRestClient.java
package com.sunxiansheng.subject.infra.basic.es;import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.apache.http.HttpHost;
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.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.reindex.BulkByScrollResponse;
import org.elasticsearch.index.reindex.DeleteByQueryRequest;
import org.elasticsearch.search.Scroll;
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.sort.ScoreSortBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.*;/*** Description: Es工具类* @Author sun* @Create 2024/6/17 17:43* @Version 1.0*/
@Component
@Slf4j
public class EsRestClient {/*表示某个集群节点对应的某个客户端的mapRestHighLevelClient:是由集群的ip端口数组生成的*/public static Map<String, RestHighLevelClient> clientMap = new HashMap<>();/*获取配置文件中填写的es.cluster.es-configs的集群信息*/@Resourceprivate EsConfigProperties esConfigProperties;/**/private static final RequestOptions COMMON_OPTIONS;/*** 为COMMON_OPTIONS进行静态初始化,在类加载的时候会执行*/static {RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();COMMON_OPTIONS = builder.build();}/*** @PostConstruct:注解用于标记一个方法,该方法会在依赖注入完成后自动调用* 这里将从配置文件中读取的集群信息封装到map中*/@PostConstructpublic void initialize() {// 获取集群节点的信息List<EsClusterConfig> esConfigs = esConfigProperties.getEsConfigs();esConfigs.forEach(esClusterConfig -> {String name = esClusterConfig.getName();String nodes = esClusterConfig.getNodes();log.info("initialize.esClusterConfig.name:{},nodes:{}", name, nodes);// 将每个集群的ip端口数组转换为RestHighLevelClientRestHighLevelClient restHighLevelClient = initRestClient(esClusterConfig);if (restHighLevelClient != null) {// 如果不为空就放到clientMap中clientMap.put(name, restHighLevelClient);} else {// 如果为空,打印日志log.error("initialize.esClusterConfig.name:{},nodes:{} is null", name, nodes);}});}/*** 通过一个集群节点来初始化该集群节点对应的客户端* @param esClusterConfig* @return*/private RestHighLevelClient initRestClient(EsClusterConfig esClusterConfig) {// 得到该集群节点的IP端口数组String[] ipPortArr = esClusterConfig.getNodes().split(",");// 初始化一个HttpHost的列表List<HttpHost> httpHostList = new ArrayList<>(ipPortArr.length);// 对每一个ip端口进行处理for (String ipPort : ipPortArr) {// 分割ip端口String[] ipPortInfo = ipPort.split(":");// 校验if (ipPortInfo.length == 2) {// 创建一个HttpPost的对象,存放ip和端口HttpHost httpHost = new HttpHost(ipPortInfo[0], NumberUtils.toInt(ipPortInfo[1]));// 放到list中httpHostList.add(httpHost);}}// 创建一个HttpHost的数组,存放HttpHostHttpHost[] httpHosts = new HttpHost[httpHostList.size()];// httpHostList的数据放到这个数组里httpHostList.toArray(httpHosts);// 得到RestClientRestClientBuilder builder = RestClient.builder(httpHosts);// 升级一下RestHighLevelClient restHighLevelClient = new RestHighLevelClient(builder);return restHighLevelClient;}/*** 获取集群名对应的RestHighLevelClient* @param clusterName* @return*/private static RestHighLevelClient getClient(String clusterName) {return clientMap.get(clusterName);}/*** 新增文档(新增一条记录)* @param esIndexInfo 包含集群名和索引名* @param esSourceData 文档id和map类型的data* @return*/public static boolean insertDoc(EsIndexInfo esIndexInfo, EsSourceData esSourceData) {try {// ==========构建表的一条数据==========// 获取es的索引名(表名)对应的请求IndexRequest indexRequest = new IndexRequest(esIndexInfo.getIndexName());// 设置源数据indexRequest.source(esSourceData.getData());// 设置记录的idindexRequest.id(esSourceData.getDocId());// ==========构建表的一条数据==========// 根据集群名获取clientgetClient(esIndexInfo.getClusterName()).index(indexRequest, COMMON_OPTIONS);// 如果没报错就返回truereturn true;} catch (Exception e) {// 打日志log.error("insertDoc.error:{}", e.getMessage(), e);}// 如果报错就返回falsereturn false;}/*** 更新文档(更新记录)* @param esIndexInfo* @param esSourceData* @return*/public static boolean updateDoc(EsIndexInfo esIndexInfo, EsSourceData esSourceData) {try {// 构建更新请求UpdateRequest updateRequest = new UpdateRequest();// 设置索引updateRequest.index(esIndexInfo.getIndexName());// 设置文档updateRequest.id(esSourceData.getDocId());// 设置源数据updateRequest.doc(esSourceData.getData());// 根据集群名获取client,执行更新操作getClient(esIndexInfo.getClusterName()).update(updateRequest, COMMON_OPTIONS);// 如果没报错就返回truereturn true;} catch (Exception e) {// 打日志log.error("updateDoc.error:{}", e.getMessage(), e);}// 如果报错就返回falsereturn false;}/*** 批量更新文档(更新记录)* @param esIndexInfo* @param esSourceDataList* @return*/public static boolean batchUpdateDoc(EsIndexInfo esIndexInfo, List<EsSourceData> esSourceDataList) {try {// 标志位boolean flag = false;// 创建一个多请求对象BulkRequest bulkRequest = new BulkRequest();// 遍历源数据的列表for (EsSourceData esSourceData : esSourceDataList) {// 获取文档idString docId = esSourceData.getDocId();// 构建一个更新请求放到BulkRequest中if (StringUtils.isNotBlank(docId)) {// 构建更新请求UpdateRequest updateRequest = new UpdateRequest();// 设置索引updateRequest.index(esIndexInfo.getIndexName());// 设置文档updateRequest.id(esSourceData.getDocId());// 设置源数据updateRequest.doc(esSourceData.getData());// 将更新请求放到BulkRequestbulkRequest.add(updateRequest);flag = true;}}// 如果flag为true,就说明更新请求已经存放完毕,可以更新了if (flag) {// 根据集群名获取客户端执行批量更新BulkResponse bulk = getClient(esIndexInfo.getClusterName()).bulk(bulkRequest, COMMON_OPTIONS);// 如果有失败的,就返回falseif (bulk.hasFailures()) {return false;}}// 如果没报错就返回truereturn true;} catch (Exception e) {// 打日志log.error("batchUpdateDoc.error:{}", e.getMessage(), e);}// 如果报错就返回falsereturn false;}/*** 删除索引下的所有文档* @param esIndexInfo* @return*/public static boolean delete(EsIndexInfo esIndexInfo) {try {// 根据索引构建一个请求DeleteByQueryRequest deleteByQueryRequest = new DeleteByQueryRequest(esIndexInfo.getIndexName());// 设置查询deleteByQueryRequest.setQuery(QueryBuilders.matchAllQuery());// 指定集群得到客户端进行删除操作BulkByScrollResponse response = getClient(esIndexInfo.getClusterName()).deleteByQuery(deleteByQueryRequest, COMMON_OPTIONS);// 获取删除的数量long deleted = response.getDeleted();log.info("deleted.size:{}", deleted);return true;} catch (Exception e) {// 打日志log.error("delete.error:{}", e.getMessage(), e);}return false;}/*** 根据id删除文档* @param esIndexInfo* @return*/public static boolean deleteDoc(EsIndexInfo esIndexInfo, String docId) {try {// 根据索引获取删除请求DeleteRequest deleteRequest = new DeleteRequest(esIndexInfo.getIndexName());// 设置要删除的文档iddeleteRequest.id(docId);// 根据集群名获取客户端,执行删除操作DeleteResponse response = getClient(esIndexInfo.getClusterName()).delete(deleteRequest, COMMON_OPTIONS);// 打日志log.info("deleted.response:{}", JSON.toJSONString(response));return true;} catch (Exception e) {// 打日志log.error("deleteDoc.error:{}", e.getMessage(), e);}return false;}/*** 根据id判断文档是否存在* @param esIndexInfo* @param docId* @return*/public static boolean isExistDocById(EsIndexInfo esIndexInfo, String docId) {try {// 根据索引获取请求GetRequest getRequest = new GetRequest(esIndexInfo.getIndexName());// 设置文档idgetRequest.id(docId);// 根据集群名返回客户端,判断文档是否存在return getClient(esIndexInfo.getClusterName()).exists(getRequest, COMMON_OPTIONS);} catch (Exception e) {// 打日志log.error("isExistDocById.error:{}", e.getMessage(), e);}return false;}/*** 根据id查询文档(一条记录)* @param esIndexInfo* @param docId* @return*/public static Map<String, Object> getDocById(EsIndexInfo esIndexInfo, String docId) {try {// 根据索引获取请求GetRequest getRequest = new GetRequest(esIndexInfo.getIndexName());// 设置文档idgetRequest.id(docId);// 根据集群名返回客户端,根据id查询文档GetResponse response = getClient(esIndexInfo.getClusterName()).get(getRequest, COMMON_OPTIONS);// 获取文档信息Map<String, Object> source = response.getSource();return source;} catch (Exception e) {// 打日志log.error("getDocById.error:{}", e.getMessage(), e);}return null;}/*** 根据id查询指定字段的文档* @param esIndexInfo* @param docId* @param fields* @return*/public static Map<String, Object> getDocById(EsIndexInfo esIndexInfo, String docId, String[] fields) {try {// 根据索引获取请求GetRequest getRequest = new GetRequest(esIndexInfo.getIndexName());// 设置文档idgetRequest.id(docId);// 设置要查询文档的指定字段FetchSourceContext fetchSourceContext = new FetchSourceContext(true, fields, null);getRequest.fetchSourceContext(fetchSourceContext);// 根据集群名返回客户端,根据id查询文档GetResponse response = getClient(esIndexInfo.getClusterName()).get(getRequest, COMMON_OPTIONS);// 获取文档信息Map<String, Object> source = response.getSource();return source;} catch (Exception e) {// 打日志log.error("getDocById.error:{}", e.getMessage(), e);}return null;}/*** 条件查询* @param esIndexInfo* @param esSearchRequest* @return*/public static SearchResponse searchWithTermQuery(EsIndexInfo esIndexInfo, EsSearchRequest esSearchRequest) {try {// 获取BoolQueryBuilderBoolQueryBuilder bq = esSearchRequest.getBq();// 获取查询条件String[] fields = esSearchRequest.getFields();int from = esSearchRequest.getFrom();int size = esSearchRequest.getSize();Boolean needScroll = esSearchRequest.getNeedScroll();Long minutes = esSearchRequest.getMinutes();String sortName = esSearchRequest.getSortName();SortOrder sortOrder = esSearchRequest.getSortOrder();HighlightBuilder highlightBuilder = esSearchRequest.getHighlightBuilder();// 构建查询条件SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.query(bq);// 查询的字段、分页、大小searchSourceBuilder.fetchSource(fields, null).from(from).size(size);// 如果有高亮的就加入条件if (Objects.nonNull(highlightBuilder)) {searchSourceBuilder.highlighter(highlightBuilder);}// 如果有排序字段就加入条件if (StringUtils.isNotBlank(sortName)) {searchSourceBuilder.sort(sortName);}// 降序排序searchSourceBuilder.sort(new ScoreSortBuilder().order(SortOrder.DESC));// 构建查询请求SearchRequest searchRequest = new SearchRequest();// 设置查询类型searchRequest.searchType(SearchType.DEFAULT);// 设置索引名searchRequest.indices(esIndexInfo.getIndexName());// 设置查询条件searchRequest.source(searchSourceBuilder);// 需要快照的情况if (needScroll) {Scroll scroll = new Scroll(TimeValue.timeValueMinutes(minutes));searchRequest.scroll(scroll);}// 通过集群名来获取客户端执行查询请求SearchResponse searchResponse = getClient(esIndexInfo.getClusterName()).search(searchRequest, COMMON_OPTIONS);return searchResponse;} catch (Exception e) {// 打日志log.error("searchWithTermQuery.error:{}", e.getMessage(), e);}return null;}}
7.配置文件和依赖同上

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/394974.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高频焊接设备配电系统无源滤波系统的设计

1、高频焊机系统谐波状况简介 变压器容量&#xff1a;S11-M-1600/10KVA&#xff08;105%&#xff09;/0.4KV 短路阻抗&#xff1a;3.9% 谐波负载情况&#xff1a;一台600KW高频焊接设备 型号&#xff1a;GGP600-0.3-HC 输入电压&#xff1a;380V 输出电压&#xff1a;0…

【Python机器学习】回归——示例:预测乐高玩具套装的价格

用回归法预测乐高套装价格的基本步骤&#xff1a; 1、收集数据&#xff1a;用Google Shopping的API收集到的数据 2、准备数据&#xff1a;从返回的JSON数据中抽取价格 3、分析算法&#xff1a;可视化并观察数据 4、训练算法&#xff1a;构建不同的模型&#xff0c;采用逐步线性…

操作ArkTS页面跳转及路由相关心得

本文为JS老狗原创。 当前端不得不关注的点&#xff1a;路由&#xff0c;今天聊一聊鸿蒙相关的一点心得。 总体上套路不意外&#xff0c;基本就是&#xff08;尤其是Web&#xff09;前端那些事&#xff1a;维护路由表、跳转带参数、历史堆栈操作&#xff0c;等等。 历史原因&…

设计模式20-备忘录模式

设计模式20-备忘录 动机定义与结构定义结构 C代码推导优缺点应用场景总结备忘录模式和序列化备忘录模式1. **动机**2. **实现方式**3. **应用场景**4. **优点**5. **缺点** 序列化1. **动机**2. **实现方式**3. **应用场景**4. **优点**5. **缺点** 对比总结 动机 在软件构建过…

云服务器和物理服务器的优缺点对比

云服务器优点在于灵活性强、成本效益高、易于扩展且支持全球化部署&#xff1b;缺点则包括安全性与可控性相对较弱&#xff0c;性能可能受限&#xff0c;以及存在服务中断风险。物理服务器则以其高性能、高稳定性、强安全性和完全可控性著称&#xff0c;但成本较高、扩展性受限…

鸿蒙OS ArkTS 省市县级联选择框,封装组件

背景&#xff1a; 公司现在要开发纯血鸿蒙版本APP&#xff0c;我被抽调过来做点功能。现在要做一个省市县级联选择框&#xff0c;并且要封装为组件&#xff0c;供其他页面模块使用。 效果图&#xff1a; 难点&#xff1a; 1. 现在官方文档上只是查到了TextPicker组件是可以做…

Vue3+setup使用vuemap/vue-amap实现地图相关操作

首先要下载依赖并且引入 npm安装 // 安装核心库 npm install vuemap/vue-amap --save// 安装loca库 npm install vuemap/vue-amap-loca --save// 安装扩展库 npm install vuemap/vue-amap-extra --save cdn <script src"https://cdn.jsdelivr.net/npm/vuemap/vue-a…

软件测试需要具备的基础知识【功能测试】---前端知识(三)

​ ​ 您好&#xff0c;我是程序员小羊&#xff01; 前言 为了更好的学习软件测试的相关技能&#xff0c;需要具备一定的基础知识。需要学习的基础知识包括&#xff1a; 1、计算机基础 2、前端知识 3、后端知识 4、软件测试理论 后期分四篇文章进行编写&#xff0c;这是第二篇 …

使用es-hadoop同步hive和es之间数据

&#x1f4bb;近期在华为云连接es时的时候发现不能输入账号密码&#xff0c;后面联系华为工程师了解到&#xff0c;华为云默认是非安全模式&#xff0c;即不需要输入账号密码。 如果对你有所帮助&#xff0c;欢迎点赞收藏关注不迷路哦&#x1f493; 目录 使用es-hadoop同步h…

AI时代,我们还可以做什么?

最近看了本书&#xff0c;书名叫做《拐点&#xff1a;站在 AI 颠覆世界的前夜》&#xff0c;作者是万维钢。 本想着看完后&#xff0c;就能掌握一整套 AI 技巧&#xff0c;结果——竟然学了很多道理。 这本书讨论了以下话题&#xff1a; 我们该怎么理解这个 AI 大时代的哲学&am…

国产数据库备份恢复实现

数据库备份恢复是数据库高可用的基本能力&#xff0c;如何通过备份数据快速高效的恢复业务并且满足不同场景下的恢复需求&#xff0c;是各数据库厂商需要关注的要点。本文将介绍几种国产数据库的备份恢复功能&#xff0c;以加深了解。 1、数据库备份恢复方案 数据库备份是生产…

函数实例讲解(七)

文章目录 清洗数据的函数&#xff08;TRIM、CLEAN&#xff09;1、TRIM2、CLEAN3、CONCATENATE4、TEXTJOIN 函数综合练习COUNTIF Excel函数总结1、判断类2、求和类3、计数类4、求平均5、查找引用类6、求数据极值类7、四舍五入类8、提取类9、日期类10、文本处理类11、随机数12、排…

基于SpringBoot+Vue的校园失物招领系统(带1w+文档)

基于SpringBootVue的校园失物招领系统(带1w文档) 基于SpringBootVue的校园失物招领系统(带1w文档) 本课题研发的校园失物招领系统管理系统&#xff0c;就是提供校园失物招领系统信息处理的解决方案&#xff0c;它可以短时间处理完信息&#xff0c;并且这些信息都有专门的存储设…

MyBatis 基本操作 - 注解版

目录 一&#xff0c;查询 - select 1.1 全列查询 1.2 指定列查询 1.3 赋值问题 方法一&#xff1a;起别名 方法二&#xff1a;结果映射 方法三&#xff1a;添加配置 二&#xff0c;新增 - Insert 2.1 使用对象插入 2.2 获取主键 三&#xff0c;删除 - Delete 四&am…

nestjs 全栈进阶--文件上传

nest new upload -p pnpm pnpm i multer pnpm i -D types/multer 允许跨域 1. 单文件上传 我们去新增一个用于上传的handler Post(upload) UseInterceptors(FileInterceptor(file, {dest: uploads })) uploadFile(UploadedFile() file: Express.Multer.File, Body() body) {…

Git使用错误分析

一.fatal: Pathspec is in submodule 我做了这样的错误操作&#xff0c;在一个仓库下的一个子目录&#xff0c;执行了git init 创建了一个子仓库&#xff0c;然后想删掉这个子仓库&#xff0c;就只删除了该子目录下的.git文件夹&#xff0c;而没有删除缓存&#xff0c;执行如下…

Python | Leetcode Python题解之第328题奇偶链表

题目&#xff1a; 题解&#xff1a; class Solution:def oddEvenList(self, head: ListNode) -> ListNode:if not head:return headevenHead head.nextodd, even head, evenHeadwhile even and even.next:odd.next even.nextodd odd.nexteven.next odd.nexteven even…

UVM(3)TLM通信

基本定义 A的方框称之为PORT&#xff0c;B的圆圈称之为EXPORT 要注意&#xff1a;无论是get还是put操作&#xff0c; 其发起者拥有的都是PORT端口&#xff0c; 而不是EXPORT transport操作&#xff0c; 如 transport操作相当于一次put操作加一次get操作&#xff0c; 数据流先…

Spring统一功能处理:拦截器、响应与异常的统一管理

目录 一.拦截器 二.统一数据返回格式 三.统一异常处理 一.拦截器 拦截器是Spring框架提供的核⼼功能之⼀&#xff0c;主要⽤来拦截⽤⼾的请求&#xff0c;在指定⽅法前后&#xff0c;根据业务需要执⾏预先设定的代码。 也就是说&#xff0c;允许开发⼈员提前预定义⼀些逻辑…

c语言-文件

11 文件 目录 11 文件 一、文件系统 二、文件操作方式 1、基于缓冲区文件操作 2、基于非缓冲区文件操作 三、文件操作的常用函数 1、fopen 2、fclose 3、fputc 4、fgetc 5、rewind 6、fseek 7、fputs 8、fgets 9、fwrite 10、fread 11、fprintf 12、fscanf …