ES-集成Springboot

321 阅读3分钟

快速搭建环境

  1. 导入依赖
<properties>
        #由于默认的版本与我们拥有的版本不一致,因此需要自定义es的版本
	<elasticsearch.version>7.12.1</elasticsearch.version>
</properties>

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
  1. 注册到Spring中
@Configuration
public class ElasticSearch_Config {
    @Bean
    public RestHighLevelClient restHighLevelClient(){
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(
                        // 非集群配置一个即可
                        new HttpHost("localhost", 9200, "http"),
                        new HttpHost("localhost", 9201, "http")));
        return client;
    }
}

API测试

1. 创建索引

@SpringBootTest
class DemoApplicationTests {
	@Resource(name="restHighLevelClient")
	private RestHighLevelClient client;
	@Test
	void contextLoads() throws IOException {
		// 1.创建一个创建索引的请求
		CreateIndexRequest request = new CreateIndexRequest("spring-es-test");
		//2.客户端处理请求,返回响应
		CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT);
		//3.查看响应
		System.out.println(response);
	}

}

DM~E9IUI.png

2. 获取索引

对于一个索引我们只能判断其是否存在

@Test
	void contextLoads_2() throws IOException {
		// 1.创建一个获取索引的请求
		GetIndexRequest request = new GetIndexRequest("spring-es-test");
		//2.客户端处理请求,返回响应
		boolean bool = client.indices().exists(request,RequestOptions.DEFAULT);
		//3.查看响应
		System.out.println(bool);
	}

3. 删除索引

@Test
	void contextLoads_3() throws IOException {
		// 1.创建一个删除索引的请求
		DeleteIndexRequest request = new DeleteIndexRequest("spring-es-test");
		//2.客户端处理请求,返回响应
		AcknowledgedResponse delete = client.indices().delete(request, RequestOptions.DEFAULT);
		//3.查看响应
		System.out.println(delete.isAcknowledged());
	}

4.文档操作CRUD

1. 添加文档

        @Test
	void contextLoads_4() throws IOException {
		//创建对象
		User user = new User("遇见", 18);
		//创建请求
		IndexRequest request=new IndexRequest("spring-es-test");
		// 设置规则 put spring-es-test/_doc/1
		request.id("1");
		request.timeout("1s");
		// 以json字符串的形式提供数据源
		request.source(JSON.toJSONString(user), XContentType.JSON);
		IndexResponse index = client.index(request, RequestOptions.DEFAULT);
		System.out.println(index.toString());
		System.out.println(index.status());

	}

2. 获取文档

storedFields与fetchSourceContext说明

@Test
	void contextLoads_5() throws IOException {
		//创建请求
		GetRequest request=new GetRequest("spring-es-test","1");
		// 设置规则 get spring-es-test/_doc/1
		//允许为此请求设置FetchSourceContext来控制是否应返回_source以及如何返回_source。
                // 不进行进行字段过滤
		//request.fetchSourceContext(new FetchSourceContext(false));
		//明确指定将要返回的存储字段。默认情况下,将返回_source字段。
		// 需要指定字段的store(默认false)为true的时候才会返回
                //request.storedFields("_type");
		System.out.println(client.exists(request, RequestOptions.DEFAULT));
		GetResponse response = client.get(request, RequestOptions.DEFAULT);
		System.out.println(response.getSourceAsString());
		System.out.println(response);

	}
        
true
{"age":18,"name":"遇见"}
{"_index":"spring-es-test","_type":"_doc","_id":"1","_version":1,"_seq_no":0,"_primary_term":1,"found":true,"_source":{"age":18,"name":"遇见"}}

3. 更新文档

@Test
void contextLoads_6() throws IOException {
	//创建请求
	UpdateRequest request=new UpdateRequest("spring-es-test","1");
	request.timeout("1s");
	User user = new User("遇见", 20);
	request.doc(JSON.toJSONString(user), XContentType.JSON);
	UpdateResponse update = client.update(request, RequestOptions.DEFAULT);
	System.out.println(update.toString());
	System.out.println(update.status());
}
UpdateResponse[index=spring-es-test,type=_doc,id=1,version=2,seqNo=1,primaryTerm=1,result=updated,shards=ShardInfo{total=2, successful=1, failures=[]}]
OK

4. 删除文档

       @Test
void contextLoads_7() throws IOException {
	//创建请求
	DeleteRequest request=new DeleteRequest("spring-es-test","1");
	request.timeout("1s");
	DeleteResponse delete = client.delete(request, RequestOptions.DEFAULT);
	System.out.println(delete.toString());
	System.out.println(delete.status());
}
DeleteResponse[index=spring-es-test,type=_doc,id=1,version=3,result=deleted,shards=ShardInfo{total=2, successful=1, failures=[]}]
OK

批量操作

  1. 批量添加
@Test
void contextLoads_8() throws IOException {
	BulkRequest bulkRequest=new BulkRequest();
	bulkRequest.timeout("10s");
	ArrayList<User> userlist=new ArrayList<>();
	userlist.add(new User("遇见1",18));
	userlist.add(new User("遇见2",19));
	userlist.add(new User("遇见3",20));
	userlist.add(new User("遇见4",21));
	for (int i=0;i<userlist.size();i++)
	{
		bulkRequest.add(new IndexRequest("spring-es-test")
				.id(""+(i+1))
				.source(JSON.toJSONString(userlist.get(i)),XContentType.JSON));
	}
	BulkResponse bulk = client.bulk(bulkRequest, RequestOptions.DEFAULT);
	// 有无失败,false代表成功
	System.out.println(bulk.hasFailures());
}
  1. 批量删除 与添加类似,只需将for循环中的方法改改即可

  2. 批量查询

@Test
void contextLoads_9() throws IOException {
	SearchRequest request=new SearchRequest("spring-es-test");
	SearchSourceBuilder sourceBuilder=new SearchSourceBuilder();
	//使用QueryBuilders 工具类来构建查询条件
	//QueryBuilders.termQuery 精准匹配
	//QueryBuilders.matchAllQuery 匹配所有
	QueryBuilder queryBuilder= QueryBuilders.termQuery("name.keyword","遇见1");
	sourceBuilder.timeout(new TimeValue(10, TimeUnit.SECONDS));
	sourceBuilder.query(queryBuilder);
	request.source(sourceBuilder);

	SearchResponse search = client.search(request, RequestOptions.DEFAULT);
	System.out.println(JSON.toJSONString(search.getHits()));
	System.out.println(search.status());
	System.out.println("=============================");
	for (SearchHit documentFields:search.getHits().getHits())
		System.out.println(documentFields.getSourceAsMap());
}

闲聊

在ElasticsearchRestClientAutoConfiguration类的静态内部类中也自动为我们配置了该对象,直接使用也可。但如果已经注册了就不能再使用该类了 @ConditionalOnMissingBean

@Configuration(proxyBeanMethods = false)
	@ConditionalOnMissingBean(RestHighLevelClient.class)
	static class RestHighLevelClientConfiguration {

		@Bean
		RestHighLevelClient elasticsearchRestHighLevelClient(RestClientBuilder restClientBuilder) {
			return new RestHighLevelClient(restClientBuilder);
		}

	}