springboot2.7.X+es8 集成开发
由于实际工作需要,需要将es8与springboot进行集成。检索了目前存在的文章,大部分都断章取义,有的甚至是拼凑(很鄙视这种)。所以我通过实际开发,整理一篇,供大家学习使用。代码可以直接copy使用。当然,肯定存在需要优化的地方,期待你的留言,废话少说,直接上内容。。。。
首先,ES8与之前的版本在Springboot中完全不同,这点需要注意。我们先加入ES8的MAVEN依赖库,如下:
<!-- elasticsearch引入依赖 start --> <dependency><groupId>co.elastic.clients</groupId><artifactId>elasticsearch-java</artifactId><version>8.1.0</version> </dependency> <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.12.3</version> </dependency> <dependency><groupId>jakarta.json</groupId><artifactId>jakarta.json-api</artifactId><version>2.0.1</version> </dependency> <!-- elasticsearch引入依赖 end -->
在集成中,有的项目对ES访问有的需要做安全配置,有的不需要,这两种方式,直接影响到配置类的编写。这里我只提供需要安全的配置类,如下:
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.http.HttpHost; import org.apache.http.auth.AuthScope; import org.apache.http.auth.UsernamePasswordCredentials; import org.apache.http.client.CredentialsProvider; import org.apache.http.client.config.RequestConfig; import org.apache.http.impl.client.BasicCredentialsProvider; import org.apache.http.impl.nio.client.HttpAsyncClientBuilder; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestClientBuilder; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.util.StringUtils;/** *@Description: springboot整合elasticsearch8 * *@Author *@CreateTime 2022/12/20 13:35 */ @Configuration public class ElasticSearchConfig {@Value("${spring.elasticsearch.uris}")private String hosts;@Value("${spring.elasticsearch.username}")private String userName;@Value("${spring.elasticsearch.password}")private String passWord;@Beanpublic ElasticsearchClient elasticsearchClient(){HttpHost[] httpHosts = toHttpHost();final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(userName, passWord));RestClientBuilder builder = RestClient.builder(httpHosts);builder.setRequestConfigCallback(new RestClientBuilder.RequestConfigCallback() {@Overridepublic RequestConfig.Builder customizeRequestConfig(RequestConfig.Builder requestConfigBuilder) {return requestConfigBuilder.setSocketTimeout(60000).setConnectTimeout(5000);}});builder.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {@Overridepublic HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpAsyncClientBuilder) {return httpAsyncClientBuilder.setDefaultCredentialsProvider(credentialsProvider);}});RestClient restClient = builder.build();ElasticsearchTransport transport = new RestClientTransport(restClient,new JacksonJsonpMapper());return new ElasticsearchClient(transport);}private HttpHost[] toHttpHost() {if (!StringUtils.hasLength(hosts)) {throw new RuntimeException("invalid elasticsearch configuration. elasticsearch.hosts不能为空!");}// 多个IP逗号隔开String[] hostArray = hosts.split(",");HttpHost[] httpHosts = new HttpHost[hostArray.length];HttpHost httpHost;for (int i = 0; i < hostArray.length; i++) {String[] strings = hostArray[i].split(":");httpHost = new HttpHost(strings[0], Integer.parseInt(strings[1]), "http");httpHosts[i] = httpHost;}return httpHosts;}}
在配置类中存在@Value部分,这个需要我们在配置中加入做需要的配置信息,如下:
spring.elasticsearch.uris = IP:port spring.elasticsearch.username = 用户名 spring.elasticsearch.password = 密码
到这里,ES8的基本集成已经能够满足我们日常的开发需要。我这里提供一个集成了对ES8相关操作的工具类,如下:
import cn.you80.daq.es.dto.base.EsQueryDTO; import co.elastic.clients.elasticsearch.ElasticsearchClient; import co.elastic.clients.elasticsearch._types.FieldValue; import co.elastic.clients.elasticsearch._types.SortOptions; import co.elastic.clients.elasticsearch._types.SortOrder; import co.elastic.clients.elasticsearch._types.query_dsl.Query; import co.elastic.clients.elasticsearch.core.CountResponse; import co.elastic.clients.elasticsearch.core.GetResponse; import co.elastic.clients.elasticsearch.core.SearchResponse; import co.elastic.clients.elasticsearch.core.search.Hit; import com.alibaba.fastjson.JSON; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component;import java.util.*;/*** @author 贵小才* @title: ElasticClientUtils* @description: ES工具类* @date 2022/4/2 9:50*/ @Component public class ElasticClientUtils<T> {/*** @param* @param client* @param dto* @param target* @return java.util.List<T>* @author liuch* @description 根据关键字查询* @date 2022/4/2 17:15*/public List<T> queryByFiled(ElasticsearchClient client, EsQueryDTO dto, Class<T> target) throws Exception {List<T> result = new ArrayList<>();List<SortOptions> sorts = new ArrayList<>();if (StringUtils.isNotBlank(dto.getOrder())) {SortOptions sortOptions = SortOptions.of(s -> s.field(f -> f.field(dto.getOrder()).order(SortOrder.valueOf(dto.getOrderType()))));sorts.add(sortOptions);}SearchResponse<HashMap> search = client.search(s -> s.index(dto.getIndexName()).query(q -> q.term(t -> t.field(dto.getField()).value(dto.getWord()))).sort(sorts),HashMap.class);return getResult(target, result, search);}/*** @param* @param client* @param dto* @param target* @return java.util.List<T>* @author liuch* @description 根据关键字查询,基于游标查询scroll* @date 2022/4/2 17:15*/public List<T> queryByFileds(ElasticsearchClient client, EsQueryDTO dto, List<Query> queries, Class<T> target) throws Exception {List<T> result = new ArrayList<>();List<SortOptions> sorts = new ArrayList<>();if (StringUtils.isNotBlank(dto.getOrder())) {SortOptions sortOptions = SortOptions.of(s -> s.field(f -> f.field(dto.getOrder()).order(SortOrder.valueOf(dto.getOrderType()))));sorts.add(sortOptions);}getFieldValues(dto, queries);//使用scroll深度分页查询SearchResponse<HashMap> search = client.search(s -> s.index(dto.getIndexName()).query(q -> q.bool(b -> b.must(queries))).size(5000).scroll(t -> t.time("5s")).sort(sorts),HashMap.class);StringBuffer scrollId = new StringBuffer(search.scrollId());//循环查询,直到查不到数据do {getResult(target, result, search);StringBuffer finalScrollId = scrollId;search = client.scroll(s -> s.scrollId(finalScrollId.toString()).scroll(t -> t.time("5s")), HashMap.class);scrollId = new StringBuffer(search.scrollId());} while (!search.hits().hits().isEmpty());//getResult(target, result, search)return result;}/*** @param* @param client* @param dto* @param target* @return java.util.List<T>* @author liuch* @description 根据关键字分页查询* @date 2022/4/2 17:15*/public List<T> queryByFiledWithPage(ElasticsearchClient client, EsQueryDTO dto, Class<T> target) throws Exception {List<T> result = new ArrayList<>();List<SortOptions> sorts = new ArrayList<>();if (StringUtils.isNotBlank(dto.getOrder())) {SortOptions sortOptions = SortOptions.of(s -> s.field(f -> f.field(dto.getOrder()).order(SortOrder.valueOf(dto.getOrderType()))));sorts.add(sortOptions);}SearchResponse<HashMap> search = client.search(s -> s.index(dto.getIndexName()).query(q -> q.term(t -> t.field(dto.getField()).value(dto.getWord()))).sort(sorts).from(dto.getFrom()).size(dto.getSize()),HashMap.class);return getResult(target, result, search);}private List<T> getResult(Class<T> target, List<T> result, SearchResponse<HashMap> search) {List<Hit<HashMap>> hits = search.hits().hits();Iterator<Hit<HashMap>> iterator = hits.iterator();while (iterator.hasNext()) {Hit<HashMap> decodeBeanHit = iterator.next();Map<String, Object> docMap = decodeBeanHit.source();docMap.put("id", decodeBeanHit.id());String json = JSON.toJSONString(docMap);T obj = JSON.parseObject(json, target);result.add(obj);}return result;}/*** @param* @param client* @param dto* @return long* @author liuch* @description 根据关键字查询总条数* @date 2022/4/2 17:15*/public static long queryCountByFiled(ElasticsearchClient client, EsQueryDTO dto) throws Exception {CountResponse count = client.count(c -> c.index(dto.getIndexName()).query(q -> q.term(t -> t.field(dto.getField()).value(dto.getWord()))));long total = count.count();return total;}/*** @param* @param client* @param dto* @return long* @author liuch* @description 根据关键字查询总条数-复合查询* @date 2022/4/2 17:15*/public static long queryCountByFileds(ElasticsearchClient client, List<Query> queries, EsQueryDTO dto) throws Exception {getFieldValues(dto, queries);CountResponse count = client.count(c -> c.index(dto.getIndexName()).query(q -> q.bool(b -> b.must(queries))));long total = count.count();return total;}/*** @param client* @param dto* @param target* @return java.util.List<T>* @author liuch* @description 根据关键字分页查询- 复合查询 must* @date 2022/4/2 17:15*/public List<T> queryMustByFiledsWithPage(ElasticsearchClient client, EsQueryDTO dto, List<Query> queries, Class<T> target) throws Exception {List<T> result = new ArrayList<>();List<SortOptions> sorts = new ArrayList<>();if (StringUtils.isNotBlank(dto.getOrder())) {SortOptions sortOptions = SortOptions.of(s -> s.field(f -> f.field(dto.getOrder()).order(SortOrder.valueOf(dto.getOrderType()))));sorts.add(sortOptions);}SearchResponse<HashMap> search = client.search(s -> s.index(dto.getIndexName()).query(q -> q.bool(b -> b.must(queries))).sort(sorts).from(dto.getFrom()).size(dto.getSize()),HashMap.class);return getResult(target, result, search);}/*** @param client* @param dto* @param target* @return java.util.List<T>* @author liuch* @description 根据关键字分页查询- 复合查询 should* @date 2022/4/2 17:15*/public List<T> queryShouldByFiledsWithPage(ElasticsearchClient client, EsQueryDTO dto, List<Query> queries, Class<T> target) throws Exception {List<T> result = new ArrayList<>();List<SortOptions> sorts = new ArrayList<>();if (StringUtils.isNotBlank(dto.getOrder())) {SortOptions sortOptions = SortOptions.of(s -> s.field(f -> f.field(dto.getOrder()).order(SortOrder.valueOf(dto.getOrderType()))));sorts.add(sortOptions);}SearchResponse<HashMap> search = client.search(s -> s.index(dto.getIndexName()).query(q -> q.bool(b -> b.should(queries))).sort(sorts).from(dto.getFrom()).size(dto.getSize()),HashMap.class);return getResult(target, result, search);}/*** 构件复合查询条件** @param dto* @param queries*/private static void getFieldValues(EsQueryDTO dto, List<Query> queries) {List<FieldValue> fieldValues = new ArrayList<>();//根据关键字列表构件复合查询的值dto.getWords().stream().forEach(word -> fieldValues.add(FieldValue.of(word)));//查询条件列表queries.add(Query.of(q -> q.terms(t -> t.field(dto.getField()).terms(v -> v.value(fieldValues)))));}/*** @param* @param client* @param dto* @param target* @return java.lang.Object* @author liuch* @description 根据文档id查询* @date 2022/4/2 17:16*/public Object queryByDocumentId(ElasticsearchClient client, EsQueryDTO dto, Class<T> target) throws Exception {GetResponse<HashMap> getResponse = client.get(s -> s.index(dto.getIndexName()).id(dto.getWord()),HashMap.class);getResponse.source();Map<String, Object> docMap = getResponse.source();String json = JSON.toJSONString(docMap);T obj = JSON.parseObject(json, target);return obj;}}
这个类基本满足我们日常大部分对ES8的操作。
我们在ES8操作中,需要创建INDEX(索引)和创建文档(Document),我在此也做了封装。
创建INDEX(索引)代码如下:
创建INDEX(索引)--接口类
import co.elastic.clients.elasticsearch._types.mapping.Property; import co.elastic.clients.elasticsearch._types.mapping.TypeMapping; import co.elastic.clients.elasticsearch.indices.GetIndexResponse; import co.elastic.clients.elasticsearch.indices.IndexSettings; import co.elastic.clients.util.ObjectBuilder;import java.io.IOException; import java.util.HashMap; import java.util.function.Function;/*** Created with IntelliJ IDEA.** @Author: * @Date: 2022/12/28/14:28* @Description:业务类---索引操作---接口*/ public interface EsIndexService {/*** 新建索引,指定索引名称** @param name* @throws IOException*/void createIndex(String name) throws IOException;/*** 创建索引,指定索引名称和setting和mapping** @param name - 索引名称* @param settingFn - 索引参数* @param mappingFn - 索引结构* @throws IOException*/void createIndex(String name, Function<IndexSettings.Builder, ObjectBuilder<IndexSettings>> settingFn,Function<TypeMapping.Builder, ObjectBuilder<TypeMapping>> mappingFn) throws IOException;/*** 删除索引** @param name* @throws IOException*/void deleteIndex(String name) throws IOException;/*** 修改索引字段信息 <br/>* 字段可以新增,已有的字段只能修改字段的 search_analyzer 属性。** @param name - 索引名称* @param propertyMap - 索引字段,每个字段都有自己的property* @throws IOException*/void updateIndexProperty(String name, HashMap<String, Property> propertyMap) throws IOException;/*** 查询索引列表** @return* @throws IOException*/GetIndexResponse getIndexList() throws IOException;/*** 查询索引详情** @param name* @return* @throws IOException*/GetIndexResponse getIndexDetail(String name) throws IOException;/*** 检查指定名称的索引是否存在** @param name* @return - true:存在* @throws IOException*/boolean indexExists(String name) throws IOException;}
创建INDEX(索引)--实现类
import cn.you80.daq.service.EsIndexService; import co.elastic.clients.elasticsearch.ElasticsearchClient; import co.elastic.clients.elasticsearch._types.mapping.Property; import co.elastic.clients.elasticsearch._types.mapping.TypeMapping; import co.elastic.clients.elasticsearch.indices.*; import co.elastic.clients.util.ObjectBuilder; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;import java.io.IOException; import java.util.HashMap; import java.util.function.Function;/*** @author: 贵小才* @since: 2022/12/28 14:29* @description: 业务类---索引操作---实现类*/ @Service @Slf4j public class EsIndexServiceImpl implements EsIndexService {@Autowiredprivate ElasticsearchClient elasticsearchClient;@Overridepublic void createIndex(String name) throws IOException {CreateIndexResponse response = elasticsearchClient.indices().create(c -> c.index(name));log.info("createIndex方法,acknowledged={}", response.acknowledged());}@Overridepublic void createIndex(String name,Function<IndexSettings.Builder, ObjectBuilder<IndexSettings>> settingFn,Function<TypeMapping.Builder, ObjectBuilder<TypeMapping>> mappingFn) throws IOException {CreateIndexResponse response = elasticsearchClient.indices().create(c -> c.index(name).settings(settingFn).mappings(mappingFn));log.info("createIndex方法,acknowledged={}", response.acknowledged());}@Overridepublic void deleteIndex(String name) throws IOException {DeleteIndexResponse response = elasticsearchClient.indices().delete(c -> c.index(name));log.info("deleteIndex方法,acknowledged={}", response.acknowledged());}@Overridepublic void updateIndexProperty(String name, HashMap<String, Property> propertyMap) throws IOException {PutMappingResponse response = elasticsearchClient.indices().putMapping(typeMappingBuilder ->typeMappingBuilder.index(name).properties(propertyMap));log.info("updateIndexMapping方法,acknowledged={}", response.acknowledged());}@Overridepublic GetIndexResponse getIndexList() throws IOException {//使用 * 或者 _all都可以GetIndexResponse response = elasticsearchClient.indices().get(builder -> builder.index("_all"));log.info("getIndexList方法,response.result()={}", response.result().toString());return response;}@Overridepublic GetIndexResponse getIndexDetail(String name) throws IOException {GetIndexResponse response = elasticsearchClient.indices().get(builder -> builder.index(name));log.info("getIndexDetail方法,response.result()={}", response.result().toString());return response;}@Overridepublic boolean indexExists(String name) throws IOException {return elasticsearchClient.indices().exists(b -> b.index(name)).value();}}
然后,继续,下面是文档创建代码。
文档--接口类
import co.elastic.clients.elasticsearch.core.BulkResponse; import co.elastic.clients.elasticsearch.core.IndexResponse; import jdk.nashorn.internal.ir.ObjectNode;import java.io.IOException; import java.util.List;/*** Created with IntelliJ IDEA.** @Author: * @Date: 2022/12/28/14:22* @Description: 业务类 --文档操作*/ public interface EsDocumentDemoService {/*** 新增一个文档** @param idxName 索引名* @param idxId 索引id* @param document 文档对象* @return*/IndexResponse createByFluentDSL(String idxName, String idxId, Object document) throws Exception;/*** 新增一个文档** @param idxName 索引名* @param idxId 索引id* @param document 文档对象* @return*/IndexResponse createByBuilderPattern(String idxName, String idxId, Object document) throws Exception;/*** 批量增加文档** @param idxName 索引名* @param documents 要增加的对象集合* @return 批量操作的结果* @throws Exception*/BulkResponse bulkCreate(String idxName, List<Object> documents) throws Exception;/*** 根据文档id查找文档** @param idxName 索引名* @param docId 文档id* @return Object类型的查找结果* @throws Exception*/Object getById(String idxName, String docId) throws IOException;/*** 根据文档id查找文档,返回类型是ObjectNode** @param idxName 索引名* @param docId 文档id* @return ObjectNode类型的查找结果*/ObjectNode getObjectNodeById(String idxName, String docId) throws IOException;/*** 根据文档id删除文档** @param idxName 索引名* @param docId 文档id* @return Object类型的查找结果* @throws Exception*/Boolean deleteById(String idxName, String docId) throws IOException;/*** 批量删除文档** @param idxName 索引名* @param docIds 要删除的文档id集合* @return* @throws Exception*/BulkResponse bulkDeleteByIds(String idxName, List<String> docIds) throws Exception;}
文档--实现类
import cn.you80.daq.service.EsDocumentDemoService; import co.elastic.clients.elasticsearch.ElasticsearchClient; import co.elastic.clients.elasticsearch.core.*; import jdk.nashorn.internal.ir.ObjectNode; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;import java.io.IOException; import java.util.List;/*** @author: 贵小才* @since: 2022/12/28 14:23* @description: 业务类---文档操作---实现类*/ @Service public class EsDocumentDemoServiceImpl implements EsDocumentDemoService {@Autowiredprivate ElasticsearchClient elasticsearchClient;@Overridepublic IndexResponse createByFluentDSL(String idxName, String idxId, Object document) throws Exception {IndexResponse response = elasticsearchClient.index(idx -> idx.index(idxName).id(idxId).document(document));return response;}@Overridepublic IndexResponse createByBuilderPattern(String idxName, String idxId, Object document) throws Exception {IndexRequest.Builder<Object> indexReqBuilder = new IndexRequest.Builder<>();indexReqBuilder.index(idxName);indexReqBuilder.id(idxId);indexReqBuilder.document(document);return elasticsearchClient.index(indexReqBuilder.build());}@Overridepublic BulkResponse bulkCreate(String idxName, List<Object> documents) throws Exception {BulkRequest.Builder br = new BulkRequest.Builder();// TODO 可以将 Object定义为一个文档基类。比如 ESDocument类// 将每一个product对象都放入builder中//documents.stream()// .forEach(esDocument -> br// .operations(op -> op// .index(idx -> idx// .index(idxName)// .id(esDocument.getId())// .document(esDocument))));return elasticsearchClient.bulk(br.build());}@Overridepublic Object getById(String idxName, String docId) throws IOException {GetResponse<Object> response = elasticsearchClient.get(g -> g.index(idxName).id(docId),Object.class);return response.found() ? response.source() : null;}@Overridepublic ObjectNode getObjectNodeById(String idxName, String docId) throws IOException {GetResponse<ObjectNode> response = elasticsearchClient.get(g -> g.index(idxName).id(docId),ObjectNode.class);return response.found() ? response.source() : null;}@Overridepublic Boolean deleteById(String idxName, String docId) throws IOException {DeleteResponse delete = elasticsearchClient.delete(d -> d.index(idxName).id(docId));return delete.forcedRefresh();}@Overridepublic BulkResponse bulkDeleteByIds(String idxName, List<String> docIds) throws Exception {BulkRequest.Builder br = new BulkRequest.Builder();// 将每一个对象都放入builder中docIds.stream().forEach(id -> br.operations(op -> op.delete(d -> d.index(idxName).id(id))));return elasticsearchClient.bulk(br.build());}}
同时,对ES的基本属性,也做了封装,代码如下:
import cn.hutool.core.date.DateUtil; import co.elastic.clients.elasticsearch._types.SortOrder; import lombok.Data; import org.apache.commons.lang3.StringUtils;import java.util.Date; import java.util.List;/*** @author 贵小才* @title: EsQueryDTO* @description: 查询对象实体类* @date 2022/4/2 10:32*/ @Data public class EsQueryDTO {private String indexName;//索引名称private String field;//关键字属性private String word;//关键字值private List<String> words;//关键字值数组private Integer from;//起始行private Integer index;//当前页private Integer size;//分页条数private String order;//排序字段private String orderType;//排序方式 asc/descprivate String dateField;//时间字段private String startTime;//时间范围-开始时间private String endTime;//时间范围-开始时间public String getOrderType() {if (StringUtils.isBlank(orderType)) {orderType = SortOrder.Desc.name();}return orderType;}public Integer getSize() {return size == 0 ? 30 : size;}public Integer getFrom() {return getIndex() != 0 ? ((getIndex() - 1) * getSize()) : 0;}public Integer getIndex() {return null == index ? 0 : index;}public String getStartTime(int offset) {if (StringUtils.isBlank(startTime)) {startTime = DateUtil.format(DateUtil.offsetDay(new Date(), offset), "yyyy-MM-dd 00:00:00");return String.valueOf(DateUtil.parse(startTime, "yyyy-MM-dd 00:00:00").getTime());}return startTime;}public String getEndTime() {if (StringUtils.isBlank(endTime)) {endTime = String.valueOf(System.currentTimeMillis());}return endTime;} }
到这里,与Springboot的集成完成。大家或许问,怎么进行调用呢,甚至在上面的一些类中,会有类似Query集合,如何做封装呢,我这边参考了ES8的基础语句,做了下面实现,废话并不多说,直接上代码:
String index = hold_id + "-user"; if (false == esIndexService.indexExists(index)) {log.info("索引不存在,创建索引 ={}", index);List<Entity> entityList = userService.load();if (CollectionUtil.isEmpty(entityList)) {return Result.builder().errCode("00001").errMsg("不存在用户信息资料").errData(msgResult).build().getString();}List<EsUserInfo> esUserInfoList = Lists.newArrayList();for (Entity entity : entityList) {EsUserInfo esUserInfo = new EsUserInfo();esUserInfo.setReal_name(entity.getStr("real_name"));esUserInfo.setMobile_phone(entity.getStr("mobile_phone"));esUserInfo.setUser_id(entity.getStr("user_id"));esUserInfoList.add(esUserInfo);}esDocumentDemoService.bulkCreate(index, Collections.singletonList(esUserInfoList)); } EsQueryDTO dto = new EsQueryDTO(); dto.setIndexName(index); dto.setSize(size); List<Query> queries = Lists.newArrayList(); Query queryName = MatchQuery.of(m -> m.field("real_name").query(keyword))._toQuery(); queries.add(queryName); Query queryPhone = MatchQuery.of(m -> m.field("mobile_phone").query(keyword))._toQuery(); queries.add(queryPhone); List<UserInfoDto> infoDtoList = esQueryService.queryShouldByFiledsWithPage(eslient, dto, queries, UserInfoDto.class); msgResult.put("result", infoDtoList);
在实际开发中一定注意这部分的组装:
Query queryName = MatchQuery.of(m -> m
.field("real_name")
.query(keyword))
._toQuery();
queries.add(queryName);
Query queryPhone = MatchQuery.of(m -> m
.field("mobile_phone")
.query(keyword))
._toQuery();
queries.add(queryPhone);
为了保证整个代码的完整性,我给出一个业务对象,这样整个ES8与Springboot的集成到这里结束。
等.......给出这个代码,才算结束!
import lombok.Data; import lombok.experimental.Accessors;/*** @author: 贵小才* @since: 2022/12/21 17:12* @description:*/ @Data @Accessors(chain = true) public class UserInfoDto {private String real_name;private String mobile_phone;private String user_id;@Overridepublic String toString() {return "UserInfoDto{" +"real_name='" + real_name + '\'' +", mobile_phone='" + mobile_phone + '\'' +", user_id='" + user_id + '\'' +'}';} }
有错的地方,希望大家指正!
springboot2.7.X+es8 集成开发相关推荐
- 【JAVA零基础入门系列】Day2 Java集成开发环境IDEA
[JAVA零基础入门系列](已完结)导航目录 Day1 开发环境搭建 Day2 Java集成开发环境IDEA Day3 Java基本数据类型 Day4 变量与常量 Day5 Java中的运算符 Day ...
- RStudio v1.2.1335 发布,R 语言的集成开发环境
开发四年只会写业务代码,分布式高并发都不会还做程序员? >>> RStudio 是 R 语言的集成开发环境,分为面向桌面用户 IDE 和 Linux R 服务器版编辑器两种编辑器 ...
- 分享:Arcadia 0.12.1 发布,Ruby 集成开发环境
Arcadia 0.12.1 发布,Ruby 集成开发环境 http://www.oschina.net/news/35942/arcadia-0-12-1
- C语言的集成开发环境
Code::Blocks,开源免费的C/C++ IDE CodeLite,开源.跨平台的C/C++集成开发环境 Dev-C++,可移植的C/C++IDE C-Free Light Table Visu ...
- 强烈推荐一款完全免费的绿色JRE+Tomcat+MySQL集成开发工具 - JTM
为什么80%的码农都做不了架构师?>>> 因为工作需要经常要将JSP项目拿到客户电脑上进行演示,但客户经常在安装配置JDK.Tomcat.MySQL的过程中出现很多问题,给客户 ...
- 使用IntelliJ IDEA 13搭建Android集成开发环境(图文教程)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- python有哪些常见的开发环境_Python集成开发环境有哪些
对于Python集成开发环境,你更喜欢哪一款? 0.Spyder Spyder是Python(x,y)的作者为它开发的一个简单的集成开发环境.和其他的Python开发环境相比,它最大的优点就是模仿MA ...
- 组态王浏览器java_1工程浏览器是组态王的集成开发环境在这里可以
您所在位置:网站首页 > 海量文档  > 计算机 > 软件工程 1工程浏览器是组态王的集成开发环境在这里可以3页 本文 ...
- arduino与java,Arduino具有与Java和C语言类似的IDE集成开发环境和图形化编程环境
Arduino具有与Java和C语言类似的IDE集成开发环境和图形化编程环境 更多相关问题 听力原文:W: Hi, Steve, good to see you are up and around a ...
最新文章
- mysql分库一个库和多个库_数据库分库后不同库之间的关联
- 【SQL】使用调用层接口
- centos7+samba 安装与调试记录
- 如何把握创业时机:当前的痛点也许是巨大的风险
- SpringMVC(一)——入门案例
- 【蓝桥杯嵌入式】【STM32】6_ADC之LCD实时显示电压值
- Python的第三方库pandas
- 一、TensorFlow的简介和安装和一些基本概念
- YIi2 Pjax简单使用
- 刷入第三方 recovery twrp
- 微信服务商开发能力说明文档怎么写
- android如何设置透明字体颜色,Android设置字体透明度
- 专题:手把手学习硬件基础------10、常用器件
- 如何在直播中解决黑屏、花屏、闪屏问题 | 直播疑难杂症排查
- xtend怎么使用_Xtend 2.3 Beta到来–为另一种JVM语言腾出空间
- 2144775-48-2,D-Biotin-PEG6-Thalidomide可用于cereblon(CRBN)结合和置换分析
- 单一职责原则(SIngel Responsibility Principle SRP)
- These are the first 50 documents matching your search, refine your search to see others
- 2022年现场综合化维护工程师四级认证考试题目
- 揭秘淘宝买衣服潜规则,你们吃亏吃大了!
热门文章
- 关于举办“COMSOL Multiphysics多物理场仿真技术与应用”光电专题线上培训班的通知
- linux驱动学习的磕磕碰碰
- Linux常用命令及面试题
- HTML+CSS静态网页制作:电影介绍(11页) HTML+CSS+JavaScript
- tortoisegit push 时提示 git did not exit cleanly (exit code 1)
- html实现展开余下全文多个,DIV+css内容太长,怎么实现点击展开余下全文?
- Python编写一个程序来计算 BMI 值。
- Java回炉之排序算法
- 基于CNN 对车牌数字进行识别,(二)
- 【CV系列】照度和最低照度相关概念