欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SpingBoot:整合Elasticsearch7.2.0

程序员文章站 2022-06-20 23:11:43
Spring boot 2.1.X整合Elasticsearch最新版的一处问题 新版本的Spring boot 2的spring boot starter data elasticsearch中支持的Elasticsearch版本是2.X,但Elasticsearch实际上已经发展到7.2.X版本 ......

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,以便启用对新版本支持,目前的版本对应关系如下

SpingBoot:整合Elasticsearch7.2.0

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
版权声明:本文为博主原创文章,转载请附上博文链接!