当前位置: 首页 > news >正文

Elasticsearch8搭建及Springboot中集成使用

1.搭建

1.1.下载地址

Elasticsearch:https://www.elastic.co/cn/downloads/elasticsearch
Kibana:https://www.elastic.co/cn/downloads/kibana

1.2.具体过程

下载安装包:访问上述链接,下载适合你操作系统的Elasticsearch和Kibana安装包。

1.3.安装Elasticsearch

解压下载的安装包。
进入解压后的目录。
如果是Windows系统,直接进入bin目录,双击elasticsearch.bat文件。看到命令行中打印日志中出现“started”,说明Elasticsearch启动完成。

linux中进入bin目录,然后执行./elasticsearch命令

详情参见linux系统安装elasticsearch教程_linux安装es-CSDN博客

1.4.配置Elasticsearch集群

修改elasticsearch.yml文件,设置集群名称、节点名称、网络主机和种子节点等。
对于集群中的其他节点,重复上述步骤,并确保每个节点的配置文件中都有所有节点的IP地址。

启动其他节点:在每个节点上重复上述安装步骤,并启动Elasticsearch服务。

检查集群健康状态:通过访问Elasticsearch的API或使用Kibana界面,查看集群的健康状态。

请注意,这只是一个基本的搭建指南。在生产环境中,你可能需要更详细的配置和优化。此外,确保你的网络设置允许Elasticsearch集群通信所需的端口。

1.5.注意点

1.不能用root权限启动,需要新建用户,如:

更改文件夹的用户为user1  chown -R user1:user1 /local
修改user1对文件夹的权限  chmod 777 /local

2.获取账号密码

elasticsearch的bin目录下,输入命令行:elasticsearch-reset-password -u elastic

2.springboot中集成ES8

2.1.依赖

<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>

2.2.elasticsearch.properties

spring.elasticsearch.uris = IP:port
spring.elasticsearch.username = 用户名
spring.elasticsearch.password = 密码

2.3.ElasticSearchConfig

@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;@Bean(name="elasticsearchClient")public 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;}
}

2.4.通用类

2.4.1.枚举类,ES实体类注解

@Target({ElemantType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ElasticSearchDocument {String index() default "";int shards() default 0;int replicas() default 0;
}

2.4.2.查询实体类

@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;}
}

2.4.3.查询工具类

@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 根据关键字分页查询- 复合查询  must 过滤* @date 2022/4/2 17:15*/public List<T> queryMustByFiledsWithPage(ElasticsearchClient client, EsQueryDTO dto, List<Query> queries, List<Query> filters, 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).filter(filters))).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;}}

2.4.4.基础操作接口

/*** 基础操作---接口*/
public interface IElasticSearchIRepository<T, V> {int delete(V id);int update(T entity);T getById(V id);List<T> getAll();long count();PageInfo<T> getListByPage(int pageIndex, int pageSize);/*** 新增一个文档** @param entity 实体类* @return*/IndexResponse createByFluentDSL(T entity);/*** 新增一个文档** @param entity 实体类* @return*/IndexResponse createByBuilderPattern(T entity);/*** 批量增加文档** @param list 对象集合* @return 批量操作的结果*/BulkResponse bulkCreate(List<T> list);/*** 根据文档id查找文档,返回类型是ObjectNode** @param id  文档id* @return ObjectNode类型的查找结果*/ObjectNode getObjectNodeById(V id);/*** 批量删除文档** @param docIds  要删除的文档id集合* @return* @throws Exception*/BulkResponse bulkDeleteByIds(List<V> docIds);/*** 根据文档id删除文档** @param idxName 索引名* @param docId   文档id* @return Object类型的查找结果* @throws Exception*/Boolean deleteById(String idxName, String docId) throws IOException;/*** 新建索引,指定索引名称**/Boolean createIndex();/*** 创建索引,指定索引名称和setting和mapping** @param settingFn - 索引参数* @param mappingFn - 索引结构*/Boolean createIndex(Function<IndexSettings.Builder, ObjectBuilder<IndexSettings>> settingFn,Function<TypeMapping.Builder, ObjectBuilder<TypeMapping>> mappingFn);/*** 删除索引* @throws IOException*/Boolean deleteIndex();/*** 修改索引字段信息 <br/>* 字段可以新增,已有的字段只能修改字段的 search_analyzer 属性。** @param propertyMap - 索引字段,每个字段都有自己的property* @throws IOException*/Boolean updateIndexProperty(HashMap<String, Property> propertyMap);/*** 查询索引列表** @return* @throws IOException*/GetIndexResponse getIndexList();/*** 查询索引详情** @return* @throws IOException*/GetIndexResponse getIndexDetail();/*** 检查指定名称的索引是否存在** @return - true:存在* @throws IOException*/boolean indexExists();}

2.4.5.基础操作接口实现类

public abstract class ElasticSearchIRepository<T,V> implements IElasticSearchIRepository<T,V> {@Autowired(required =false)@Qualifier("elasticsearchClient")private ElasticsearchClient elasticsearchClient;protected ElasticSearchDocument getEntityProperties() {Class<T> cls = getEntityClass();ElasticSearchDocument esDoc = cls.getAnnotation(ElasticSearchDocument .calss);return esDoc;}/**设置索引全局配置*/protected abstract Function<IndexSettings.builder, ObjectBuilder<IndexSettings>> getIndexSettings();/**手动设置映射(不手动设置会自动创建映射,同时在插入时若手动映射时没有的字段也会自动创建)*/protected abstract Function<TypeMapping.builder, ObjectBuilder<TypeMapping>> getIndexMappings();protected abstract Class<T> getEntityClass();@Overridepublic int update(T entity) {try {ElasticSearchDocument doc = getEntityProperties();UpdateRequest updateRequest = new UpdateRequest.Builder().index(doc.index()).id(entity.getId().toString()).doc(entity).build();UpdateResponse updateResponse = elasticsearchClient.update(updateRequest, entity.getClass());return updateResponse != null && StringUtils.isNotEmpty(updateResponse.id()) ? 1 : 0;}catch (IOException e) {log.error(e);}return 0;}@Overridepublic PageInfo<T> getListByPage(int pageIndex, int pageSize) {List<T> list = new ArrayList<>();try {ElasticSearchDocument doc = getEntityProperties();ElasticClientUtils elasticClientUtils = new ElasticClientUtils();EsQueryDTO dto = new EsQueryDTO();dto.setIndex(paeIndex);dto.setSize(pageSize);dto.setIndexName(doc.index());list = elasticClientUtils.queryPage(elasticsearchClient, dto, getEntityClass());return new PageInde<T>(pageIndex, pageSize, (long)list.size(), list);}catch (IOException e) {log.error(e);}return new PageInde<T>(pageIndex, pageSize, 0L, list);}@Overridepublic int delete(V id) {try {ElasticSearchDocument doc = getEntityProperties();DeleteResponse delete = elasticsearchClient.delete(d -> d.index(doc.index()).id(id.toString()));return delete.forcedRefresh() ? 1 : 0;}catch (IOException e) {log.error(e);}return 0;}@Overridepublic List<T> getAll() {try {ElasticSearchDocument doc = getEntityProperties();ElasticClientUtils elasticClientUtils = new ElasticClientUtils();EsQueryDTO dto = new EsQueryDTO();dto.setIndexName(doc.index());return elasticClientUtils.queryAll(elasticsearchClient, dto, getEntityClass());}catch (IOException e) {log.error(e);}return null;}@Overridepublic long count() {try {ElasticSearchDocument doc = getEntityProperties();EsQueryDTO dto = new EsQueryDTO();dto.setIndexName(doc.index());return ElasticClientUtils.queryCountByFiled(elasticsearchClient, dto);}catch (IOException e) {log.error(e);}return 0;}@Overridepublic IndexResponse createByFluentDSL(T entity) {try {ElasticSearchDocument doc = getEntityProperties();IndexResponse response = elasticsearchClient.index(index -> idx.index(doc.index()).id(entity.getId().toString()).document(entity));return response;}catch (IOException e) {log.error(e);}return null;}@Overridepublic IndexResponse createByBuilderPattern(T entity) {try {ElasticSearchDocument doc = getEntityProperties();IndexRequest.Builder<Object> indexReqBuilder = new IndexRequest.Builder<>();indexReqBuilder.index(doc.index());indexReqBuilder.id(entity.getId().toString());indexReqBuilder.document(entity);return elasticsearchClient.index(indexReqBuilder.build());}catch (IOException e) {log.error(e);}return null;}@Overridepublic BulkResponse bulkCreate(List<T> documents) {try {ElasticSearchDocument doc = getEntityProperties();BulkRequest.Builder br = new BulkRequest.Builder();documents.stream().forEach(esDocument -> br.operations(op -> op.index(idx -> idx.index(doc.index()).id(esDocument.getId().toString()).document(esDocument))));return elasticsearchClient.bulk(br.build());}catch (IOException e) {log.error(e);}return null;}@Overridepublic T getById(V id) {try {ElasticSearchDocument doc = getEntityProperties();GetResponse<Object> response = elasticsearchClient.get(g -> g.index(doc.index()).id(id.toString()),Object.class);return response.found() ? FastJsonUtil.fromJson(response.source().toString(), getEntityClass()) : null;}catch (IOException e) {log.error(e);}return null;}@Overridepublic ObjectNode getObjectNodeById(V id) {try {ElasticSearchDocument doc = getEntityProperties();GetResponse<ObjectNode> response = elasticsearchClient.get(g -> g.index(doc.index()).id(id.toString()),ObjectNode.class);return response.found() ? response.source() : null;}catch (IOException e) {log.error(e);}return null;}@Overridepublic BulkResponse bulkDeleteByIds(List<V> docIds) {try {ElasticSearchDocument doc = getEntityProperties();BulkRequest.Builder br = new BulkRequest.Builder();// 将每一个对象都放入builder中docIds.stream().forEach(id -> br.operations(op -> op.delete(d -> d.index(doc.index()).id(id.toString()))));return elasticsearchClient.bulk(br.build());}catch (IOException e) {log.error(e);}return null;}/**自动创建映射*/@Overridepublic Boolean createIndex() {try {ElasticSearchDocument doc = getEntityProperties();CreateIndexResponse response = elasticsearchClient.indices().create(c -> c.index(doc.index()));log.info("createIndex方法,acknowledged={}", response.acknowledged());return response.acknowledged();}catch (IOException e) {log.error(e);}return false;}/**手动创建映射*/@Overridepublic Boolean createIndex(Function<IndexSettings.Builder, ObjectBuilder<IndexSettings>> settingFn,Function<TypeMapping.Builder, ObjectBuilder<TypeMapping>> mappingFn) {try {ElasticSearchDocument doc = getEntityProperties();CreateIndexResponse response = elasticsearchClient.indices().create(c -> c.index(doc.index()).settings(settingFn).mappings(mappingFn));log.info("createIndex方法,acknowledged={}", response.acknowledged());return response.acknowledged();}catch (IOException e) {log.error(e);}return false;}@Overridepublic Boolean deleteIndex() {try {ElasticSearchDocument doc = getEntityProperties();DeleteIndexResponse response = elasticsearchClient.indices().delete(c -> c.index(doc.index()));log.info("deleteIndex方法,acknowledged={}", response.acknowledged());return response.acknowledged();}catch (IOException e) {log.error(e);}return false;}@Overridepublic Boolean updateIndexProperty(HashMap<String, Property> propertyMap) {try {ElasticSearchDocument doc = getEntityProperties();PutMappingResponse response = elasticsearchClient.indices().putMapping(typeMappingBuilder ->typeMappingBuilder.index(doc.index()).properties(propertyMap));log.info("updateIndexMapping方法,acknowledged={}", response.acknowledged());return response.acknowledged();}catch (IOException e) {log.error(e);}return false;}@Overridepublic GetIndexResponse getIndexList() {try {ElasticSearchDocument doc = getEntityProperties();//使用 * 或者 _all都可以GetIndexResponse response = elasticsearchClient.indices().get(builder -> builder.index("_all"));log.info("getIndexList方法,response.result()={}", response.result().toString());return response;}catch (IOException e) {log.error(e);}return null;}@Overridepublic GetIndexResponse getIndexDetail() {try {ElasticSearchDocument doc = getEntityProperties();GetIndexResponse response = elasticsearchClient.indices().get(builder -> builder.index(doc.index()));log.info("getIndexDetail方法,response.result()={}", response.result().toString());return response;}catch (IOException e) {log.error(e);}return null;}@Overridepublic boolean indexExists() {try {ElasticSearchDocument doc = getEntityProperties();return elasticsearchClient.indices().exists(b -> b.index(doc.index())).value();}catch (IOException e) {log.error(e);}return null;}  }

2.5.业务

2.5.1.接口

pulbic interface testRepo extends IElasticSearchIRepository<TestESDO, Long> {}

2.5.2. 实现类

@component
pulbic calss testRepo extends ElasticSearchIRepository<TestESDO, Long> implements testRepo{/**设置索引全局配置*/@Overrideprotected Function<IndexSettings.builder, ObjectBuilder<IndexSettings>> getIndexSettings() {return builder -> builder.numberOfShards("3").numberOfReplicas("1");}/**手动设置映射(不手动设置会自动创建映射,同时在插入时若手动映射时没有的字段也会自动创建)*/@Overrideprotected Function<TypeMapping.builder, ObjectBuilder<TypeMapping>> getIndexMappings() {return builder -> {HashMap<String, Property> propertiesMap = new HashMap<>();propertiesMap.put("id", new Property.Builder().Long_(new LongNumberProperty.Builder().build()).build());return builder.properties(propertiesMap);}}@Overrideprotected Class<T> getEntityClass() {return TestESDO.clas;    
}
}

2.5.3. 实体类

@Data
@ElasticSearchCocument(index="test")
public class TestESDO {private Long id;
}

2.5.4. 常见查询方法

1.使用MultiMatch可以多字段,如果想要把搜索词当成一个整体来匹配查询还需要增加TextQueryType.Phrase,如

//must复合查询
List<Query> queries = new ArrayLict<>();
MultiMatchQuery multiMatchQuery = new MultiMatchQuery.Builder().query("搜索词").type(TextQueryType.Phrase).fields("字段1", "字段2").build();
Query query = new Query.Builder().multiMatch(multiMatchQuery).build();
queries.add(multiMatchQuery);

2.使用TermsQuery进行数组过滤,如对某个字段[1,2,3,4]进行过滤,要求只有搜索词中包含这些数字就进行匹配,如4,5或者1,2,3或者1,代码如下

//过滤
List<Query> filters = new ArrayLict<>();
List<FieldValue> fieldValueList = new ArrayList<>();
fieldValueList.add(new FieldValue.Builder().longValue(1).buld());
TermsQuery termsQuery = new TermsQuery .Builder().field("字段1").terms(new TermsQueryField.Builder().value(fieldValueList).build()).build();
Query filter = new Query.Builder().terms(termsQuery).build();
filters.add(filter);

3.更多查询参见:ElasticSearch使用教程、设计到实战-CSDN博客 

相关文章:

Elasticsearch8搭建及Springboot中集成使用

1.搭建 1.1.下载地址 Elasticsearch&#xff1a;https://www.elastic.co/cn/downloads/elasticsearch Kibana&#xff1a;https://www.elastic.co/cn/downloads/kibana 1.2.具体过程 下载安装包&#xff1a;访问上述链接&#xff0c;下载适合你操作系统的Elasticsearch和Ki…...

asp.net在线租车平台

说明文档 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 主要技术&#xff1a; 基于asp.net架构和sql server数据库 功能模块&#xff1a; asp.net在线租车平台 用户功能有首页 行业新闻用户注册车辆查询租车介绍访问后台 后台管理员可以进行用户管理 管…...

Beamer模板——基于LaTeX制作学术PPT

Beamer模板——基于LaTeX制作学术PPT 介绍Beamer的基本使用安装和编译用于学术汇报的模板项目代码模板效果图 Beamer的高级特性动态效果分栏布局定理环境 介绍 在学术领域&#xff0c;演示文稿是展示和讨论研究成果的重要方式。传统的PowerPoint虽然方便&#xff0c;但在处理复…...

性能测试-Jmeter中IF控制器使用

一、Jmeter控制器 分为两种类型&#xff1a; 控制测试计划执行过程中节点的逻辑执行顺序&#xff0c;如&#xff1a;循环控制器&#xff0c;if控制器等对测试计划中的脚本进行分组&#xff0c;方便Jmeter统计执行结果以及进行脚本的运行时控制等&#xff0c;如&#xff1a;吞…...

华为综合案例-普通WLAN全覆盖配置(2)

组网图 结果验证 在AC_1和AC_2上执行display ap all命令&#xff0c;检查当前AP的状态&#xff0c;显示以下信息表示AP上线成功。[AC_1] display ap all Total AP information: nor : normal [1] ExtraInfo : Extra information P : insufficient power supply ---…...

这里是一本关于 DevOps 企业级 CI/CD 实战的书籍...

文章目录 &#x1f4cb; 前言&#x1f3af; 什么是 DevOps&#x1f3af; 什么是 CI/CD&#x1f3af;什么是 Jenkins&#x1f9e9; Jenkins 简单案例 &#x1f3af; DevOps 企业级实战书籍推荐&#x1f525; 参与方式 &#x1f4cb; 前言 企业级 CI/CD 实战是一个涉及到软件开发…...

机器学习 - save和load训练好的模型

如果已经训练好了一个模型&#xff0c;你就可以save和load这模型。 For saving and loading models in PyTorch, there are three main methods you should be aware of. PyTorch methodWhat does it do?torch.saveSaves a serialized object to disk using Python’s pickl…...

【动态规划】【同余前缀和】【多重背包】[推荐]2902. 和带限制的子多重集合的数目

本文涉及知识点 动态规划汇总 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 C算法&#xff1a;滑动窗口总结 多重背包 LeetCode2902. 和带限制的子多重集合的数目 给你一个下标从 0 开始的非负整数数组 nums 和两个整数 l 和 r 。 请你…...

nginx介绍及搭建

架构模型 Nginx是由一个master管理进程、多个worker进程组成的多进程模型。master负责管理worker进程&#xff0c;worker进程负责处理网络事件&#xff0c;整个框架被设计为一种依赖事件驱动、异步、非阻塞的模式。 优势&#xff1a; 1、充分利用多核&#xff0c;增强并发处理…...

树莓派夜视摄像头拍摄红外LED灯

NoIR相机是一种特殊类型的红外摄像头&#xff0c;其名称来源于"No Infrared"的缩写。与普通的彩色摄像头不同&#xff0c;NoIR相机具备红外摄影和低光条件下摄影的能力。 一般摄像头能够感知可见光&#xff0c;并用于普通摄影和视频拍摄。而NoIR相机则在设计上去除了…...

Oracle19C静默安装教程

文章目录 一、安装前的准备1、安装Linux操作系统2、配置网络源或者本地源3、hosts文件配置 二、准备安装环境1、安装依赖包2、创建oracle用户组3、配置系统内核参数4、关闭selinux5、配置oracle用户环境6、修改用户的Shell限制 三、静默安装Oracle数据库1、创建oracle安装目录2…...

【机器学习】基于粒子群算法优化的BP神经网络分类预测(PSO-BP)

目录 1.原理与思路2.设计与实现3.结果预测4.代码获取 1.原理与思路 【智能算法应用】智能算法优化BP神经网络思路【智能算法】粒子群算法&#xff08;PSO&#xff09;原理及实现 2.设计与实现 数据集&#xff1a; 多输入多输出&#xff1a;样本特征24&#xff0c;标签类别4…...

Sora后时代文生视频的探索

一、写在前面 按常理&#xff0c;这里应该长篇大论地介绍一下Sora发布对各行业各方面产生的影响。不过&#xff0c;这类文章已经很多了&#xff0c;我们今天主要聊聊那些已经成熟的解决方案、那些已经可以“信手拈来”的成果&#xff0c;并以此为基础&#xff0c;看看Sora发布…...

指南:在各主流操作系统上安装与配置Apache Tomcat

指南&#xff1a;在各主流操作系统上安装与配置Apache Tomcat Apache Tomcat作为一款广受欢迎的开源Java Servlet容器&#xff0c;为用户提供了一个纯Java环境下的Web服务器和Servlet容器。本文将详细介绍如何在不同的操作系统上安装Apache Tomcat&#xff0c;并进行基本的配置…...

物联网的介绍

物联网&#xff08;Internet of Things&#xff0c;简称IoT&#xff09;是指通过互联网将物理设备、传感器、通信设备和软件系统相互连接&#xff0c;形成一个网络化的系统。它可以实现设备之间的数据交换、信息共享和远程控制&#xff0c;使得物理世界与数字世界紧密结合。 物…...

目标检测——YOLOR算法解读

论文&#xff1a;YOLOR-You Only Learn One Representation: Unifified Network for Multiple Tasks 作者&#xff1a;Chien-Yao Wang, I-Hau Yeh, Hong-Yuan Mark Liao 链接&#xff1a;https://arxiv.org/abs/2105.04206 代码&#xff1a;https://github.com/WongKinYiu/yolo…...

NVIDIA NCCL 源码学习(十三)- IB SHARP

背景 之前我们看到了基于ring和tree的两种allreduce算法&#xff0c;对于ring allreduce&#xff0c;一块数据在reduce scatter阶段需要经过所有的rank&#xff0c;allgather阶段又需要经过所有rank&#xff1b;对于tree allreduce&#xff0c;一块数据数据在reduce阶段要上行…...

Spark-Scala语言实战(4)

在之前的文章中&#xff0c;我们学习了如何在scala中定义无参&#xff0c;带参以及匿名函数。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。 Spark-Scala语言…...

ffmpeg不常用命令整理

最近做了许多有关音视频方面的工作&#xff0c;接触了一些不常用的命令&#xff0c;整理分享出来。 1.剪辑视频 ffmpeg -ss 1 -to 4 -accurate_seek -i input.mp4 -c:v copy output.mp4指定从视频中的第1秒开始&#xff0c;到第4秒结束的部分剪辑。 ss&#xff1a;指定开始时…...

怎么理解面向对象?一文带你全面理解

文章目录 1、类和对象&#xff08;1&#xff09;面向过程和面向对象初步认识&#xff08;2&#xff09;类的引入&#xff08;3&#xff09;类的定义&#xff08;4&#xff09;类的访问限定符及封装4.1 访问限定符4.2 封装 &#xff08;5&#xff09;类的作用域&#xff08;6&am…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业&#xff0c;那宇树科技&#xff08;Unitree&#xff09;必须名列其榜。 最近&#xff0c;宇树科技的一项新变动消息在业界引发了不少关注和讨论&#xff0c;即&#xff1a; 宇树向其合作伙伴发布了一封公司名称变更函称&#xff0c;因…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能

1. 开发环境准备 ​​安装DevEco Studio 3.1​​&#xff1a; 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK ​​项目配置​​&#xff1a; // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量&#xff1a;setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...