zoukankan      html  css  js  c++  java
  • ES集成SpringBoot

    集成SpringBoot

    找官方文档 https://www.elastic.co/guide/index.html

     1、原生的mave

      2、找对象

     

     3、分析这个类中的方法

     配置基本项目

     

     

     发现默认的版本是6.8.6,版本不符,所以要自定义es版本

     写一个config将对象注入进来

    分析springboot源码

    es的默认配置

     

     

     虽然导入了三个类,但都是静态内部类,核心类就一个

    /*
     * Copyright 2012-2019 the original author or authors.
     *
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     *
     *      https://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */
    
    package org.springframework.boot.autoconfigure.elasticsearch.rest;
    
    import java.time.Duration;
    
    import org.apache.http.HttpHost;
    import org.apache.http.auth.AuthScope;
    import org.apache.http.auth.Credentials;
    import org.apache.http.auth.UsernamePasswordCredentials;
    import org.apache.http.client.CredentialsProvider;
    import org.apache.http.impl.client.BasicCredentialsProvider;
    import org.elasticsearch.client.RestClient;
    import org.elasticsearch.client.RestClientBuilder;
    import org.elasticsearch.client.RestHighLevelClient;
    
    import org.springframework.beans.factory.ObjectProvider;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
    import org.springframework.boot.context.properties.PropertyMapper;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    /**
     * Elasticsearch rest client infrastructure configurations.
     *
     * @author Brian Clozel
     * @author Stephane Nicoll
     */
    class RestClientConfigurations {
    
    	@Configuration(proxyBeanMethods = false)
    	static class RestClientBuilderConfiguration {
       //  RestClientBuilder
    		@Bean
    		@ConditionalOnMissingBean
    		RestClientBuilder elasticsearchRestClientBuilder(RestClientProperties properties,
    				ObjectProvider<RestClientBuilderCustomizer> builderCustomizers) {
    			HttpHost[] hosts = properties.getUris().stream().map(HttpHost::create).toArray(HttpHost[]::new);
    			RestClientBuilder builder = RestClient.builder(hosts);
    			PropertyMapper map = PropertyMapper.get();
    			map.from(properties::getUsername).whenHasText().to((username) -> {
    				CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
    				Credentials credentials = new UsernamePasswordCredentials(properties.getUsername(),
    						properties.getPassword());
    				credentialsProvider.setCredentials(AuthScope.ANY, credentials);
    				builder.setHttpClientConfigCallback(
    						(httpClientBuilder) -> httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider));
    			});
    			builder.setRequestConfigCallback((requestConfigBuilder) -> {
    				map.from(properties::getConnectionTimeout).whenNonNull().asInt(Duration::toMillis)
    						.to(requestConfigBuilder::setConnectTimeout);
    				map.from(properties::getReadTimeout).whenNonNull().asInt(Duration::toMillis)
    						.to(requestConfigBuilder::setSocketTimeout);
    				return requestConfigBuilder;
    			});
    			builderCustomizers.orderedStream().forEach((customizer) -> customizer.customize(builder));
    			return builder;
    		}
    
    	}
    
    	@Configuration(proxyBeanMethods = false)
    	@ConditionalOnClass(RestHighLevelClient.class)
    	static class RestHighLevelClientConfiguration {
      //RestHighLevelClient 高级客户端
    		@Bean
    		@ConditionalOnMissingBean
    		RestHighLevelClient elasticsearchRestHighLevelClient(RestClientBuilder restClientBuilder) {
    			return new RestHighLevelClient(restClientBuilder);
    		}
    
    		@Bean
    		@ConditionalOnMissingBean
    		RestClient elasticsearchRestClient(RestClientBuilder builder,
    				ObjectProvider<RestHighLevelClient> restHighLevelClient) {
    			RestHighLevelClient client = restHighLevelClient.getIfUnique();
    			if (client != null) {
    				return client.getLowLevelClient();
    			}
    			return builder.build();
    		}
    
    	}
    
    	@Configuration(proxyBeanMethods = false)
    	static class RestClientFallbackConfiguration {
      //RestClient普通客户端
    		@Bean
    		@ConditionalOnMissingBean
    		RestClient elasticsearchRestClient(RestClientBuilder builder) {
    			return builder.build();
    		}
    
    	}
    
    }
    

    测试高级客户端的api

    索引和文档

    package com.renzhe;
    
    import com.alibaba.fastjson.JSON;
    import com.renzhe.pojo.User;
    import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
    import org.elasticsearch.action.bulk.BulkRequest;
    import org.elasticsearch.action.bulk.BulkResponse;
    import org.elasticsearch.action.delete.DeleteRequest;
    import org.elasticsearch.action.delete.DeleteResponse;
    import org.elasticsearch.action.get.GetRequest;
    import org.elasticsearch.action.get.GetResponse;
    import org.elasticsearch.action.index.IndexRequest;
    import org.elasticsearch.action.index.IndexResponse;
    import org.elasticsearch.action.search.SearchRequest;
    import org.elasticsearch.action.search.SearchResponse;
    import org.elasticsearch.action.support.master.AcknowledgedResponse;
    import org.elasticsearch.action.update.UpdateRequest;
    import org.elasticsearch.action.update.UpdateResponse;
    import org.elasticsearch.client.IndicesClient;
    import org.elasticsearch.client.RequestOptions;
    import org.elasticsearch.client.RestHighLevelClient;
    import org.elasticsearch.client.indices.CreateIndexRequest;
    import org.elasticsearch.client.indices.CreateIndexResponse;
    import org.elasticsearch.client.indices.GetIndexRequest;
    import org.elasticsearch.common.unit.TimeValue;
    import org.elasticsearch.common.xcontent.XContentType;
    import org.elasticsearch.index.query.QueryBuilder;
    import org.elasticsearch.index.query.QueryBuilders;
    import org.elasticsearch.index.query.TermQueryBuilder;
    import org.elasticsearch.search.SearchHit;
    import org.elasticsearch.search.SearchHits;
    import org.elasticsearch.search.builder.SearchSourceBuilder;
    import org.elasticsearch.search.fetch.subphase.FetchSourceContext;
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.boot.test.autoconfigure.data.neo4j.AutoConfigureDataNeo4j;
    import org.springframework.boot.test.context.SpringBootTest;
    
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.concurrent.TimeUnit;
    
    /**
     * es 7.6.x 高级客户端测试 Api
     *
     */
    @SpringBootTest
    class RenzheEsApiApplicationTests {
    	//面向对象来操作
    	@Autowired
    	@Qualifier("restHighLevelClient")
    	//注入的时候变量名会去匹配自己定义的方法名,如果变量名与方法名不一样那么就会报红
    	//如果想使用自定义的变量名 就加上@Qualifier注解去匹配自己的定义的方法名
    	private RestHighLevelClient client;
    	//测试索引的创建  Request
    	@Test
    	void testCreateIndex() throws IOException {
    		//1、创建索引请求
    		CreateIndexRequest request = new CreateIndexRequest("renzhe_index");
             //2、客户端执行请求   IndicesClient,请求后获得响应  会抛出IO异常
    		CreateIndexResponse createIndexResponse =
    				client.indices().create(request, RequestOptions.DEFAULT);
    		System.out.println(createIndexResponse);
    
    	}
    
    
    	//测试获取索引
    	@Test
    	void testExistIndex() throws IOException{
    		GetIndexRequest request = new GetIndexRequest("renzhe_index");
    		boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
    		System.out.println(exists);
    	}
    
    	// 测试删除索引  删除请求后获取响应
    	@Test
    	void testDeleteIndex() throws IOException {
    		DeleteIndexRequest request = new DeleteIndexRequest("renzhe_index");
    		AcknowledgedResponse delete = client.indices().delete(request, RequestOptions.DEFAULT);
    		System.out.println(delete);
    	}
    
    	//测试添加文档
    	@Test
        void testAddDocument() throws IOException {
    		//创建对象
    		User user = new User("renzhe", 3);
    		//创建请求 (连接renzhe_index的索引库)
    		IndexRequest request = new IndexRequest("renzhe_index");
    		// 规则 put /renzhe_index/_doc/1
    		request.id("1");
    		request.timeout(TimeValue.timeValueSeconds(1));
    		request.timeout("1s");
    		//将数据放入请求 所有的数据都是json数据 所以要引入alibaba的fastjson
    		request.source(JSON.toJSONString(user), XContentType.JSON);
    		//客户端发送请求 获取响应的结果
    		IndexResponse indexResponse = client.index(request, RequestOptions.DEFAULT);
    		System.out.println(indexResponse.toString());
    		System.out.println(indexResponse.status()); //对应命令中返回的状态
    
    	}
    
    	//获取文档,判断是否存在 get /index/_doc/1
    
    	@Test
    	void testIsExists() throws  IOException{
    		GetRequest getRequest = new GetRequest("renzhe_index", "1");
    	    //不获取返回的_source的上下文了
    		getRequest.fetchSourceContext(new FetchSourceContext(false));
    	    getRequest.storedFields("_none_");
    		boolean exists = client.exists(getRequest, RequestOptions.DEFAULT);
    		System.out.println(exists);
    	}
    
    	//获取文档的信息
    
    	@Test
    	void testGetDocument() throws IOException{
    		GetRequest getRequest = new GetRequest("renzhe_index", "1");
    		GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);
    		System.out.println(getResponse.getSourceAsString());//打印文档内容
    		System.out.println(getResponse);//这里返回的全部内容和命令是一样的
    
    	}
    
    	//更新文档内容
    
    	@Test
    	void testUpdateDocument() throws IOException{
    		UpdateRequest updateRequest = new UpdateRequest("renzhe_index", "1");
    		updateRequest.timeout("1s");
    		User user = new User("hello world", 9);
    		updateRequest.doc(JSON.toJSONString(user),XContentType.JSON);
    		UpdateResponse updateResponse = client.update(updateRequest, RequestOptions.DEFAULT);
    		System.out.println(updateResponse);
    	}
    
    	//删除文档记录
    	@Test
    	void  testDeleteDocument() throws IOException{
    		DeleteRequest deleteRequest = new DeleteRequest("renzhe_index", "1");
    		deleteRequest.timeout("1s");
    		DeleteResponse delete = client.delete(deleteRequest, RequestOptions.DEFAULT);
    		System.out.println(delete);
    	}
    
    	//特殊的 真实项目 都是需要大批量数据的导入
    
    	@Test
    	void testBulkRequest() throws IOException{
    		BulkRequest bulkRequest = new BulkRequest();
    		bulkRequest.timeout("1s");
    		ArrayList<User> userList = new ArrayList();
    		userList.add(new User("renzhe1",1));
    		userList.add(new User("renzhe2",1));
    		userList.add(new User("renzhe3",1));
    		userList.add(new User("renzhe4",1));
    		userList.add(new User("renzhe5",1));
    		userList.add(new User("renzhe6",1));
    		userList.add(new User("renzhe7",1));
    		userList.add(new User("renzhe8",1));
    		userList.add(new User("renzhe9",1));
          //批处理请求
    		for (int i = 0; i < userList.size(); i++) {
    			//批量更新和批量删除在这里修改对应的请求即可
    			bulkRequest.add(new IndexRequest("renzhe_index")
    			.id(""+(i+1))
    			.source(JSON.toJSONString(userList.get(i)),XContentType.JSON));
                
    
    		}
    		BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);
    		System.out.println(bulkResponse.hasFailures());
    	}
    
    	//查询
    	@Test
    	void testSearch() throws  IOException{
    		SearchRequest searchRequest = new SearchRequest("renzhe_index");
    	    //构建搜索的条件
    		SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    		//QueryBuilders.termQuery() 精确匹配
    		TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name", "renzhe1");
    		//QueryBuilders.matchAllQuery();
    		sourceBuilder.query(termQueryBuilder);
    		//分页 默认有 可以不写
    		/*sourceBuilder.from();
    		sourceBuilder.size();*/
    
    		sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
            //构建搜索
            searchRequest.source(sourceBuilder);
    		SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
    		SearchHits searchHits = searchResponse.getHits();
    		System.out.println(JSON.toJSONString(searchHits));
    		System.out.println("===============================");
    		for (SearchHit documentFields : searchResponse.getHits().getHits()) {
    			System.out.println(documentFields.getSourceAsMap());
    		}
    	}
    
    }
    

      

      

  • 相关阅读:
    Android Widget桌面组件创建
    Android 音乐播放器。
    android 创建实时文件夹
    Android 中访问网页 webView
    Android 添加快捷方式
    Android闹钟设置
    Android中webView与javascript交互
    Android 通信的桥梁 Intent
    Android 中Notification和NotificationManager的使用
    Android中播放视频
  • 原文地址:https://www.cnblogs.com/jamers-rz/p/14438655.html
Copyright © 2011-2022 走看看