时间:2021-05-20
Spring boot 2.1.X整合Elasticsearch最新版的一处问题
新版本的Spring boot 2的spring-boot-starter-data-elasticsearch中支持的Elasticsearch版本是2.X,但Elasticsearch实际上已经发展到7.2.X版本了,为了更好的使用Elasticsearch的新特性,所以弃用了spring-boot-starter-data-elasticsearch依赖,而改为直接使用Spring-data-elasticsearch,以便启用对新版本支持,目前的版本对应关系如下
Elasticsearch(ES)有两种连接方式:transport、rest。transport通过TCP方式访问ES(只支持java),rest方式通过http API 访问ES(没有语言限制)。引入依赖:
<dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>${elasticsearch.version}</version> </dependency> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-client</artifactId> <version>${elasticsearch.version}</version> </dependency> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>${elasticsearch.version}</version> </dependency>application.yml配置:
elasticsearch: ip: 192.168.52.132:9200客户端连接配置类
package com.dc.elastic.configuration;import org.apache.commons.lang3.StringUtils;import org.apache.http.HttpHost;import org.apache.http.client.config.RequestConfig;import org.elasticsearch.client.RestClient;import org.elasticsearch.client.RestClientBuilder;import org.elasticsearch.client.RestHighLevelClient;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import java.util.Arrays;import java.util.Objects;/** * 描述: 连接客户端 * * @author leo * @create 2019-08-25 13:22 */@Configurationpublic class ElasticsearchRestClient{ /** * 超时时间设为5分钟 */ private static final int TIME_OUT = 5 * 60 * 1000; private static final int ADDRESS_LENGTH = 2; private static final String HTTP_SCHEME = "http"; @Value("${elasticsearch.ip}") String[] ipAddress; @Bean public RestClientBuilder restClientBuilder() { System.err.println(ipAddress); HttpHost[] hosts = Arrays.stream(ipAddress) .map(this::makeHttpHost) .filter(Objects::nonNull) .toArray(HttpHost[]::new); return RestClient.builder(hosts); } @Bean(name = "highLevelClient") public RestHighLevelClient highLevelClient(@Autowired RestClientBuilder restClientBuilder) { restClientBuilder.setRequestConfigCallback( new RestClientBuilder.RequestConfigCallback() { @Override public RequestConfig.Builder customizeRequestConfig( RequestConfig.Builder requestConfigBuilder) { return requestConfigBuilder.setSocketTimeout(TIME_OUT); } }); //TODO 此处可以进行其它操作 return new RestHighLevelClient(restClientBuilder); } private HttpHost makeHttpHost(String s) { assert StringUtils.isNotEmpty(s); String[] address = s.split(":"); if (address.length == ADDRESS_LENGTH) { String ip = address[0]; int port = Integer.parseInt(address[1]); System.err.println(ip+"+"+port); return new HttpHost(ip, port, HTTP_SCHEME); } else { return null; } }}测试controller
@RequestMapping("/test") public void test(@RequestParam String keyword) { Integer pageIndex = 1; Integer pageSize = 5; String indexName = "vw_ods"; Map<String, Object> data = new HashMap<>(); data.put("clearacctname", keyword); List<Map<String, Object>> result = new ArrayList<Map<String, Object>>(); SearchRequest searchRequest = new SearchRequest(indexName); // searchRequest.types(indexName); queryBuilder(pageIndex, pageSize, data, indexName, searchRequest); try { SearchResponse response = highLevelClient.search(searchRequest, RequestOptions.DEFAULT); for (SearchHit hit : response.getHits().getHits()) { Map<String, Object> map = hit.getSourceAsMap(); map.put("id", hit.getId()); result.add(map); // 取高亮结果 Map<String, HighlightField> highlightFields = hit.getHighlightFields(); HighlightField highlight = highlightFields.get("clearacctname"); Text[] fragments = highlight.fragments(); // 多值的字段会有多个值 String fragmentString = fragments[0].string(); System.out.println("高亮:" + fragmentString); } System.out.println("pageIndex:" + pageIndex); System.out.println("pageSize:" + pageSize); System.out.println(response.getHits().getTotalHits()); System.out.println(result.size()); for (Map<String, Object> map : result) { System.out.println(map.get("clearacctname")); } } catch (IOException e) { e.printStackTrace(); } } private void queryBuilder(Integer pageIndex, Integer pageSize, Map<String, Object> query, String indexName, SearchRequest searchRequest) { if (query != null && !query.keySet().isEmpty()) { SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); if (pageIndex != null && pageSize != null) { searchSourceBuilder.size(pageSize); if (pageIndex <= 0) { pageIndex = 0; } searchSourceBuilder.from((pageIndex - 1) * pageSize); } BoolQueryBuilder boolBuilder = QueryBuilders.boolQuery(); query.keySet().forEach(key -> { boolBuilder.must(QueryBuilders.matchQuery(key, query.get(key))); }); searchSourceBuilder.query(boolBuilder); HighlightBuilder highlightBuilder = new HighlightBuilder(); HighlightBuilder.Field highlightTitle = new HighlightBuilder.Field("title").preTags("<strong>").postTags("</strong>"); highlightTitle.highlighterType("unified"); highlightBuilder.field(highlightTitle); searchSourceBuilder.highlighter(highlightBuilder); SearchRequest source = searchRequest.source(searchSourceBuilder); } }以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文介绍SpringBoot项目中整合ElasticSearch并实现CRUD操作,包括分页、滚动等功能。之前在公司使用ES,一直用的是前辈封装好的包,最近希望
springboot整合vue实现上传下载文件,供大家参考,具体内容如下环境springboot1.5.x完整代码下载:springboot整合vue实现上传下
ElasticSearch是一个开源的,分布式,实时搜索和分析引擎。SpringBoot为Elasticsearch及SpringDataElasticsear
前言本篇文章主要讲述的是springboot整合mybatis、druid和pagehelper并实现多数据源和分页。其中springboot整合mybatis
本文讲述springboot整合springsecurity在方法上使用注解实现权限控制,使用自定义userdetailservice,从mysql中加载用户信