由于实际工作需要,需要将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 集成开发相关推荐

  1. 【JAVA零基础入门系列】Day2 Java集成开发环境IDEA

    [JAVA零基础入门系列](已完结)导航目录 Day1 开发环境搭建 Day2 Java集成开发环境IDEA Day3 Java基本数据类型 Day4 变量与常量 Day5 Java中的运算符 Day ...

  2. RStudio v1.2.1335 发布,R 语言的集成开发环境

    开发四年只会写业务代码,分布式高并发都不会还做程序员? >>>   RStudio 是 R 语言的集成开发环境,分为面向桌面用户 IDE 和 Linux R 服务器版编辑器两种编辑器 ...

  3. 分享:Arcadia 0.12.1 发布,Ruby 集成开发环境

    Arcadia 0.12.1 发布,Ruby 集成开发环境 http://www.oschina.net/news/35942/arcadia-0-12-1

  4. C语言的集成开发环境

    Code::Blocks,开源免费的C/C++ IDE CodeLite,开源.跨平台的C/C++集成开发环境 Dev-C++,可移植的C/C++IDE C-Free Light Table Visu ...

  5. 强烈推荐一款完全免费的绿色JRE+Tomcat+MySQL集成开发工具 - JTM

    为什么80%的码农都做不了架构师?>>>    因为工作需要经常要将JSP项目拿到客户电脑上进行演示,但客户经常在安装配置JDK.Tomcat.MySQL的过程中出现很多问题,给客户 ...

  6. 使用IntelliJ IDEA 13搭建Android集成开发环境(图文教程)

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  7. python有哪些常见的开发环境_Python集成开发环境有哪些

    对于Python集成开发环境,你更喜欢哪一款? 0.Spyder Spyder是Python(x,y)的作者为它开发的一个简单的集成开发环境.和其他的Python开发环境相比,它最大的优点就是模仿MA ...

  8. 组态王浏览器java_1工程浏览器是组态王的集成开发环境在这里可以

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp计算机&nbsp>&nbsp软件工程 1工程浏览器是组态王的集成开发环境在这里可以3页 本文 ...

  9. arduino与java,Arduino具有与Java和C语言类似的IDE集成开发环境和图形化编程环境

    Arduino具有与Java和C语言类似的IDE集成开发环境和图形化编程环境 更多相关问题 听力原文:W: Hi, Steve, good to see you are up and around a ...

最新文章

  1. mysql分库一个库和多个库_数据库分库后不同库之间的关联
  2. 【SQL】使用调用层接口
  3. centos7+samba 安装与调试记录
  4. 如何把握创业时机:当前的痛点也许是巨大的风险
  5. SpringMVC(一)——入门案例
  6. 【蓝桥杯嵌入式】【STM32】6_ADC之LCD实时显示电压值
  7. Python的第三方库pandas
  8. 一、TensorFlow的简介和安装和一些基本概念
  9. YIi2 Pjax简单使用
  10. 刷入第三方 recovery twrp
  11. 微信服务商开发能力说明文档怎么写
  12. android如何设置透明字体颜色,Android设置字体透明度
  13. 专题:手把手学习硬件基础------10、常用器件
  14. 如何在直播中解决黑屏、花屏、闪屏问题 | 直播疑难杂症排查
  15. xtend怎么使用_Xtend 2.3 Beta到来–为另一种JVM语言腾出空间
  16. 2144775-48-2,D-Biotin-PEG6-Thalidomide可用于cereblon(CRBN)结合和置换分析
  17. 单一职责原则(SIngel Responsibility Principle  SRP)
  18. These are the first 50 documents matching your search, refine your search to see others
  19. 2022年现场综合化维护工程师四级认证考试题目
  20. 揭秘淘宝买衣服潜规则,你们吃亏吃大了!

热门文章

  1. 关于举办“COMSOL Multiphysics多物理场仿真技术与应用”光电专题线上培训班的通知
  2. linux驱动学习的磕磕碰碰
  3. Linux常用命令及面试题
  4. HTML+CSS静态网页制作:电影介绍(11页) HTML+CSS+JavaScript
  5. tortoisegit push 时提示 git did not exit cleanly (exit code 1)
  6. html实现展开余下全文多个,DIV+css内容太长,怎么实现点击展开余下全文?
  7. Python编写一个程序来计算 BMI 值。
  8. Java回炉之排序算法
  9. 基于CNN 对车牌数字进行识别,(二)
  10. 【CV系列】照度和最低照度相关概念