• SpingBoot:整合Elasticsearch7.2.0


    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(没有语言限制)。
    ES官方建议使用rest方式, transport 在7.0版本中不建议使用,在8.X的版本中废弃。

    引入依赖:

            <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
     */
    @Configuration
    public 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);
            }
        }
    

    官方文档:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/7.2/java-rest-overview.html

    作者:onlooker
    来源:三无青年博客
    原文:https://www.35youth.cn/712.html
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    编译安装redis-3.2.9(latest stable version)
    MySQL之从忘记密码到重置密码
    Linux时间和时区设定
    java.net.UnknownHostException 异常处理(转)
    制作FastDFS的RPM包
    RPM包安装MySQL 5.7.18
    白鹭http请求post
    iframe嵌套页面 跨域
    git 配置 https和ssh 免密码登录 常用操作命令
    php 错误提示开启
  • 原文地址:https://www.cnblogs.com/35youth/p/11408063.html
Copyright © 2020-2023  润新知