美文网首页ElasticSearch
ElasticSearch系列四:JAVA-API调用ES-AP

ElasticSearch系列四:JAVA-API调用ES-AP

作者: suxin1932 | 来源:发表于2019-01-01 21:40 被阅读0次

    1.Elasticsearch6中RestHighLevelClient和RestLowLevelClient

    图片.png

    1.1pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.zy</groupId>
        <artifactId>spring-elasticsearch-demo</artifactId>
        <version>1.0-SNAPSHOT</version>
        <packaging>war</packaging>
    
        <properties>
            <spring.version>5.1.3.RELEASE</spring.version>
            <jackson.core.version>2.9.8</jackson.core.version>
            <elasticsearch.version>6.5.4</elasticsearch.version>
            <fastjson.version>1.2.54</fastjson.version>
            <lombok.version>1.16.20</lombok.version>
        </properties>
    
        <dependencies>
            <!-- spring全家桶系列 -->
            <!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-beans</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context-support</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-expression</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webmvc</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-web</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <!--  server-->
            <!-- https://mvnrepository.com/artifact/org.elasticsearch/elasticsearch -->
            <dependency>
                <groupId>org.elasticsearch</groupId>
                <artifactId>elasticsearch</artifactId>
                <version>${elasticsearch.version}</version>
            </dependency>
            <!-- rest-high-level-client -->
            <dependency>
                <groupId>org.elasticsearch.client</groupId>
                <artifactId>elasticsearch-rest-high-level-client</artifactId>
                <version>${elasticsearch.version}</version>
            </dependency>
            <!-- json转换 -->
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
                <version>${jackson.core.version}</version>
            </dependency>
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-core</artifactId>
                <version>${jackson.core.version}</version>
            </dependency>
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-annotations</artifactId>
                <version>${jackson.core.version}</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>${fastjson.version}</version>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
                <version>1.7.25</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-slf4j-impl -->
            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-slf4j-impl</artifactId>
                <version>2.11.1</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-core</artifactId>
                <version>2.11.1</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/javax.servlet/servlet-api -->
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>servlet-api</artifactId>
                <version>2.5</version>
                <scope>provided</scope>
            </dependency>
            <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-lang3</artifactId>
                <version>3.8.1</version>
            </dependency>
    
        </dependencies>
    
        <build>
            <finalName>spring-springmvc</finalName>
            <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
                <plugins>
                    <plugin>
                        <artifactId>maven-clean-plugin</artifactId>
                        <version>3.0.0</version>
                    </plugin>
                    <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
                    <plugin>
                        <artifactId>maven-resources-plugin</artifactId>
                        <version>3.0.2</version>
                    </plugin>
                    <plugin>
                        <artifactId>maven-compiler-plugin</artifactId>
                        <version>3.7.0</version>
                    </plugin>
                    <plugin>
                        <artifactId>maven-surefire-plugin</artifactId>
                        <version>2.20.1</version>
                    </plugin>
                    <plugin>
                        <artifactId>maven-war-plugin</artifactId>
                        <version>3.2.0</version>
                    </plugin>
                    <plugin>
                        <artifactId>maven-install-plugin</artifactId>
                        <version>2.5.2</version>
                    </plugin>
                    <plugin>
                        <artifactId>maven-deploy-plugin</artifactId>
                        <version>2.8.2</version>
                    </plugin>
                </plugins>
            </pluginManagement>
        </build>
    </project>
    

    1.2web.xml

    <!DOCTYPE web-app PUBLIC
     "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
     "http://java.sun.com/dtd/web-app_2_3.dtd" >
    
    <web-app>
      <display-name>spring-elasticsearch-demo</display-name>
      <!--  配置spring主配置文件 -->
      <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
      </context-param>
      <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
      </listener>
      <!--配置springmvc-->
      <servlet>
        <servlet-name>DispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--配置初始化参数-->
        <init-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <!--配置启动的优先级-->
        <load-on-startup>1</load-on-startup>
      </servlet>
      <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
      </servlet-mapping>
    </web-app>
    

    1.3spring.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:mvc="http://www.springframework.org/schema/mvc"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
                               http://www.springframework.org/schema/beans/spring-beans.xsd
                               http://www.springframework.org/schema/context
                               http://www.springframework.org/schema/context/spring-context.xsd
                               http://www.springframework.org/schema/mvc
                               http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    
        <!--开启自动扫包-->
        <context:component-scan base-package="com.zy.controller"/>
    
        <!--开启注解驱动:用来替换处理器适配器和处理器映射器-->
        <mvc:annotation-driven/>
    
    </beans>
    

    1.4applicationContext.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
                               http://www.springframework.org/schema/beans/spring-beans.xsd
                               http://www.springframework.org/schema/context
                               http://www.springframework.org/schema/context/spring-context.xsd">
    
        <context:component-scan base-package="com.zy.config, com.zy.utils"/>
    
    </beans>
    

    1.5配置类

    package com.zy.config;
    
    import org.apache.http.HttpHost;
    import org.apache.http.client.config.RequestConfig;
    import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
    import org.elasticsearch.client.RestClient;
    import org.elasticsearch.client.RestClientBuilder;
    import org.elasticsearch.client.RestHighLevelClient;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    import java.io.IOException;
    
    @Configuration
    public class ESConfigBean {
        private String host = "127.0.0.1";
        private int port = 9200;
        private String schema = "http";
        private int connectTimeOut = 1000;
        private int socketTimeOut = 30000;
        private int connectionRequestTimeOut = 500;
        private int maxConnectNum = 100;
        private int maxConnectPerRoute = 100;
        private HttpHost httpHost;
        private boolean uniqueConnectTimeConfig = true;
        private boolean uniqueConnectNumConfig = true;
        private RestClientBuilder builder;
        private RestHighLevelClient client;
    
        /**
         * Bean name default  函数名字
         *
         * @return
         */
        @Bean(name = "restHighLevelClient")
        public RestHighLevelClient restHighLevelClient() {
            httpHost= new HttpHost(host, port, schema);
            builder = RestClient.builder(httpHost);
            if (uniqueConnectTimeConfig) {
                setConnectTimeOutConfig();
            }
            if (uniqueConnectNumConfig) {
                setMutiConnectConfig();
            }
            client = new RestHighLevelClient(builder);
            return client;
        }
    
        /**
         * 异步httpclient的连接延时配置
         */
        public void setConnectTimeOutConfig() {
            builder.setRequestConfigCallback(new RestClientBuilder.RequestConfigCallback() {
                @Override
                public RequestConfig.Builder customizeRequestConfig(RequestConfig.Builder requestConfigBuilder) {
                    requestConfigBuilder.setConnectTimeout(connectTimeOut);
                    requestConfigBuilder.setSocketTimeout(socketTimeOut);
                    requestConfigBuilder.setConnectionRequestTimeout(connectionRequestTimeOut);
                    return requestConfigBuilder;
                }
            });
        }
    
        /**
         * 异步httpclient的连接数配置
         */
        public void setMutiConnectConfig() {
            builder.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
                @Override
                public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
                    httpClientBuilder.setMaxConnTotal(maxConnectNum);
                    httpClientBuilder.setMaxConnPerRoute(maxConnectPerRoute);
                    return httpClientBuilder;
                }
            });
        }
    
        /**
         * 关闭连接
         */
        public void close() {
            if (client != null) {
                try {
                    client.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    
    }
    

    1.6工具类

    package com.zy.utils;
    
    import com.alibaba.fastjson.JSONObject;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
    import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
    import org.elasticsearch.action.index.IndexRequest;
    import org.elasticsearch.action.index.IndexResponse;
    import org.elasticsearch.client.*;
    import org.elasticsearch.common.xcontent.XContentType;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    
    import javax.annotation.PostConstruct;
    import java.io.IOException;
    @Component
    public class ElasticSearchUtil {
    
        private static final Logger LOGGER = LoggerFactory.getLogger(ElasticSearchUtil.class);
    
        @Autowired
        private RestHighLevelClient restHighLevelClient;
    
        private static RestHighLevelClient client;
    
        @PostConstruct
        public void init() {
            client = this.restHighLevelClient;
        }
    
        private static ObjectMapper mapper = new ObjectMapper();
    
        /**
         * 创建索引
         * @param index
         * @param requestOptions
         * @return
         */
        public static boolean createIndex(String index, RequestOptions requestOptions) {
            CreateIndexRequest request = new CreateIndexRequest(index);
            boolean flag;
            try {
                CreateIndexResponse indexResponse = client.indices().create(request, requestOptions);
                flag = indexResponse.isAcknowledged();
                if (flag) {
                    LOGGER.info("创建索引成功!");
                }
                else {
                    LOGGER.info("创建索引失败!");
                }
            } catch (IOException e) {
                LOGGER.error("failed to create index: {}.", index, e);
                flag = false;
            }
            return flag;
        }
    
        /**
         * 新增索引
         * @param index
         * @param document
         * @param id
         * @param object
         * @param requestOptions
         * @return
         */
        public static String add(String index, String document, String id, JSONObject object, RequestOptions requestOptions) {
            IndexRequest indexRequest = new IndexRequest(index, document, id);
            try {
                indexRequest.source(mapper.writeValueAsString(object), XContentType.JSON);
                IndexResponse indexResponse = client.index(indexRequest, requestOptions);
                return indexResponse.getId();
            } catch (IOException e) {
                LOGGER.error("failed to add index: {}, document: {}, id: {}.", index, document, id, e);
            }
            return null;
        }
    
        /**
         * 检查某索引是否存在:同步方法
         * @param request
         * @return
         */
        public static boolean checkIndexExist(Request request) {
            try {
                Response response = client.getLowLevelClient().performRequest(request);
                return response.getStatusLine().getReasonPhrase().equals("OK");
            } catch (IOException e) {
                LOGGER.error("index is not exist, request is {}.", request, e);
            }
            return false;
        }
    
        /**
         * 获取低水平客户端
         * @return
         */
        public static RestClient getLowLevelClient() {
            return client.getLowLevelClient();
        }
    
    }
    

    1.7controller层

    package com.zy.controller;
    
    import com.alibaba.fastjson.JSONObject;
    import com.zy.utils.ElasticSearchUtil;
    import org.apache.commons.lang3.StringUtils;
    import org.apache.http.HttpEntity;
    import org.apache.http.entity.ContentType;
    import org.apache.http.nio.entity.NStringEntity;
    import org.apache.http.util.EntityUtils;
    import org.elasticsearch.action.index.IndexRequest;
    import org.elasticsearch.client.Request;
    import org.elasticsearch.client.RequestOptions;
    import org.elasticsearch.client.Response;
    import org.elasticsearch.client.RestClient;
    import org.elasticsearch.common.xcontent.XContentBuilder;
    import org.elasticsearch.common.xcontent.json.JsonXContent;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.bind.annotation.RestController;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.time.LocalDateTime;
    import java.time.format.DateTimeFormatter;
    
    @RestController
    @RequestMapping("/es/")
    public class ESController {
    
        private static final Logger LOGGER = LoggerFactory.getLogger(ESController.class);
    
        /**
         * 参考链接
         * https://blog.csdn.net/chy2z/article/details/81703012
         */
    
        /**
         *
         * @return
         */
        @GetMapping("index")
        @ResponseBody
        public Object indexPage() {
            return "hello world";
        }
    
        /**
         * http://localhost:8080/es/createIndex
         * 创建索引
         *
         * @param request
         * @param response
         * @param index
         * @return
         */
        @RequestMapping("/createIndex")
        @ResponseBody
        public String createIndex(HttpServletRequest request, HttpServletResponse response, String index) {
            Request request1 = new Request("HEAD", index);
            if (!ElasticSearchUtil.checkIndexExist(request1)) {
                if (ElasticSearchUtil.createIndex(request1.getEndpoint(), RequestOptions.DEFAULT)) {
                    return "索引创建成功";
                } else {
                    return "索引已经失败";
                }
            } else {
                return "索引已经存在";
            }
        }
    
        /**
         * 插入记录
         * http://localhost:8080/es/add
         *
         * @return
         */
        @RequestMapping("/add")
        @ResponseBody
        public String addData() {
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("id", DateTimeFormatter.ofPattern("yyyyMMdd").format(LocalDateTime.now()));
            jsonObject.put("age", 30);
            jsonObject.put("name", "tom");
            jsonObject.put("date", LocalDateTime.now());
            String id = ElasticSearchUtil.add("hello",
                    "hello_type",
                    jsonObject.getString("id"),
                    jsonObject,
                    RequestOptions.DEFAULT);
            if (StringUtils.isNotBlank(id)) {
                return "success";
            } else {
                return "failure";
            }
        }
    
        /**
         * 查询所有
         *
         * @return
         */
        @GetMapping("queryAll")
        @ResponseBody
        public String queryAll() {
            HttpEntity entity = new NStringEntity(
                    "{ \"query\": { \"match_all\": {}}}",
                    ContentType.APPLICATION_JSON);
            String endPoint = "/hello/hello_type/_search";
            try {
                Request request = new Request("POST", endPoint);
                request.setEntity(entity);
                Response response = ElasticSearchUtil.getLowLevelClient().performRequest(request);
                return EntityUtils.toString(response.getEntity());
            } catch (IOException e) {
                LOGGER.error("failed to query", e);
            }
            return "failed to queryAll";
        }
    
        /**
         * 根据条件查询
         *
         * @return
         */
        @GetMapping("/queryByMatch")
        @ResponseBody
        public String queryByMatch() {
            try {
                String endPoint = "/hello/hello_type/_search";
                IndexRequest indexRequest = new IndexRequest();
                XContentBuilder builder;
                try {
                    builder = JsonXContent.contentBuilder().
                            startObject().
                            startObject("query").
                            startObject("match").
                            field("name.keyword", "jerry").
                            // field("name", "jerry").
                                    endObject().
                                    endObject().
                                    endObject();
                    indexRequest.source(builder);
                } catch (IOException e) {
                    LOGGER.error("failed to query,", e);
                }
                String source = indexRequest.source().utf8ToString();
                LOGGER.info("source---->" + source);
                HttpEntity entity = new NStringEntity(source, ContentType.APPLICATION_JSON);
                Request request = new Request("post", endPoint);
                request.setEntity(entity);
                Response response = ElasticSearchUtil.getLowLevelClient().performRequest(request);
                return EntityUtils.toString(response.getEntity());
            } catch (IOException e) {
                LOGGER.error("failed to query, name: {}.", "jerry", e);
            }
            return "failed to query";
        }
    
        /**
         * 复合查询
         *
         * @return
         */
        @RequestMapping("/queryByCompound")
        @ResponseBody
        public String queryByCompound() {
            try {
                String endPoint = "/hello/hello_type/_search";
                IndexRequest indexRequest = new IndexRequest();
                XContentBuilder builder;
                try {
                    builder = JsonXContent.contentBuilder().
                            startObject().
                                startObject("query").
                                    startObject("bool").
                                        startObject("must").
                                            startObject("match").
                                                field("name.keyword", "tom").
                                            endObject().
                                        endObject().
                                        startObject("filter").
                                            startObject("range").
                                                startObject("age").
                                                    field("gte", "10").
                                                    field("lte", "50").
                                                endObject().
                                            endObject().
                                        endObject().
                                    endObject().
                                endObject().
                            endObject();
                    indexRequest.source(builder);
                } catch (IOException e) {
                    LOGGER.error("failed to query", e);
                }
                String source = indexRequest.source().utf8ToString();
                LOGGER.info("source---->" + source);
                HttpEntity entity = new NStringEntity(source, ContentType.APPLICATION_JSON);
                Request request = new Request("post", endPoint);
                request.setEntity(entity);
                Response response = ElasticSearchUtil.getLowLevelClient().performRequest(request);
                return EntityUtils.toString(response.getEntity());
            } catch (IOException e) {
                LOGGER.error("failed to query", e);
            }
            return "failed to query";
        }
    }
    

    相关文章

      网友评论

        本文标题:ElasticSearch系列四:JAVA-API调用ES-AP

        本文链接:https://www.haomeiwen.com/subject/yauolqtx.html