当前位置: 首页 > 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…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...