1、ElasticSearch依赖

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency> 

2、构建RestHighLevelClient(高级客户端)对象,实现SpringBoot和elasticSearch集成,返回一个client
在IDEA中,如何使用已经配好的ElasticSearch,将项目个ElasticSearch和SpringBoot整合在一起
首先在官网是看到
在这里插入图片描述
翻译:
在这里插入图片描述
所以一个高级的客户端(RestHighLevelClient)需要一个Rest低级客户端构造器来构建
所以我们要在定义一个配之类来提供这种功能。elasticSearch就是通过这一步和SpringBoot集成的

@Configuration
public RestHighLevelClient restHighLevelClient(){
	@Bean
	public RestHighLevelClient restHighLevelClient() {
	RestHighLevelClient client = new RestHighLevelClient(
		RestClient.builder(
			//整个new HttpHost("localhost",9200,“http”)可以配置多个
			//在集群的时候就可以配置多个
			new HttpHost("localhost", 9200, "http")));
	return client;
	}
}

ElasticSearch中的常用方法工具类封装(就是在一个类中封装了对索引的创建、删除等一系列的操作)

/**
*@Component声明这个类将被SpringIOC容器扫描装配
*/
@Component
public class ElasticSearchUtils<T> {
@Autowired
private RestHighLevelClient restHighLevelClient;

/**
* 判断索引是否存在
*/
public boolean existsIndex(String index) throws IOException {
	GetIndexRequest request = new GetIndexRequest(index);
	boolean exists = client.indices().exists(request,RequestOptions.DEFAULT);
	return exists;
}

/**
*创建索引
*/
public boolean createIndex(String index) throws IOException {
CreateIndexRequest request = new CreateIndexRequest(index);
CreateIndexResponse createIndexResponse=client.indices().create(request,RequestOptions.DEFAULT);
return createIndexResponse.isAcknowledged();
}

/**
*删除索引
*/
public boolean deleteIndex(String index) throws IOException {
	DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest(index);
	AcknowledgedResponse response = client.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
	return response.isAcknowledged();
}

/**
*判断某索引下文档id是否存在
*/
public boolean docExists(String index, String id) throws IOException {
	GetRequest getRequest = new GetRequest(index,id);
	//只判断索引是否存在不需要获取_source
	//getRequest.fetchSourceContext(new FetchSourceContext(false));
	//getRequest.storedFields("_none_");
	boolean exists = client.exists(getRequest, RequestOptions.DEFAULT);
	return exists;
}

/**
*添加文档记录
*/
public boolean addDoc(String index,String id,T t) throws IOException {
	IndexRequest request = new IndexRequest(index);
	request.id(id);
	//设置超时时间
	request.timeout(TimeValue.timeValueSeconds(1));
	request.timeout("1s");
	//将前端获取来的数据封装成一个对象转换成JSON格式放入请求中
	request.source(JSON.toJSONString(t), XContentType.JSON);
	IndexResponse indexResponse = client.index(request,RequestOptions.DEFAULT);
	RestStatus Status = indexResponse.status();
	return Status==RestStatus.OK||Status== RestStatus.CREATED;
}

/**
*根据id来获取记录
*/
public GetResponse getDoc(String index, String id) throws IOException {
	GetRequest request = new GetRequest(index,id);
	GetResponse getResponse = client.get(request,RequestOptions.DEFAULT);
	return getResponse;
}

/**
*批量添加文档记录
*/
public boolean bulkAdd(String index, List<T> list) throws IOException {
	BulkRequest bulkRequest = new BulkRequest();
	//设置超时时间
	bulkRequest.timeout(TimeValue.timeValueMinutes(2));
	bulkRequest.timeout("2m");
	for (int i =0;i<list.size();i++){
		bulkRequest.add(new IndexRequest(index).source(JSON.toJSONString(list.get(i))));
	}
	BulkResponse bulkResponse = client.bulk(bulkRequest,
	RequestOptions.DEFAULT);
	return !bulkResponse.hasFailures();
}

/**
*更新文档记录
*/
public boolean updateDoc(String index,String id,T t) throws IOException
{
	UpdateRequest request = new UpdateRequest(index,id);
	request.doc(JSON.toJSONString(t));
	request.timeout(TimeValue.timeValueSeconds(1));
	request.timeout("1s");
	UpdateResponse updateResponse = client.update(request, RequestOptions.DEFAULT);
	return updateResponse.status()==RestStatus.OK;
}

/**
*删除文档记录
*/
public boolean deleteDoc(String index,String id) throws IOException {
	DeleteRequest request = new DeleteRequest(index,id);
	request.timeout(TimeValue.timeValueSeconds(1));
	request.timeout("1s");
	DeleteResponse deleteResponse = client.delete(request, RequestOptions.DEFAULT);
	return deleteResponse.status()== RestStatus.OK;
}

/**
*根据某字段来搜索
*/
public void search(String index,String field ,String key,Integer from,Integer size) throws IOException {
	SearchRequest searchRequest = new SearchRequest(index);
	SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
	sourceBuilder.query(QueryBuilders.termQuery(field, key));
	//控制搜素
	sourceBuilder.from(from);
	sourceBuilder.size(size);
	//最大搜索时间。
	sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
	searchRequest.source(sourceBuilder);
	SearchResponse searchResponse = client.search(searchRequest,RequestOptions.DEFAULT);
	System.out.println(JSON.toJSONString(searchResponse.getHits()));
	}
}

以上ElasticSearchUtils<T>就是我们对索引和文档的一些增删改查的封装。

一下下是一些API的测试操作
(1)创建索引测试

@Test
public void testCreateIndex() throws IOException {
	CreateIndexRequest request = new CreateIndexRequest("索引");
	CreateIndexResponse createIndexResponse =restHighLevelClient.indices().create(request,RequestOptions.DEFAULT);
	System.out.println(createIndexResponse);
}

(2)获取索引测试

@Test
public void testExistsIndex() throws IOException {
	GetIndexRequest request = new GetIndexRequest("索引");
	boolean exists = restHighLevelClient.indices().exists(request,RequestOptions.DEFAULT);
	System.out.println(exists);
}

(3)删除索引测试

@Test
pubic void testDeleteIndexRequest() throws IOException {
	DeleteIndexRequest deleteIndexRequest = newDeleteIndexRequest("索引");
	AcknowledgedResponse response = restHighLevelClient.indices().delete(deleteIndexRequest,RequestOptions.DEFAULT);
	System.out.println(response.isAcknowledged());
}

添加文档记录测试:
创建一个实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
public class User {
	private String name;
	private int age;
}

(1)添加文档记录测试

@Test
public void testAddDocument() throws IOException {
	// 创建对象
	User user = new User("UserName", UserAge);
	// 创建请求
	IndexRequest request = new IndexRequest("UserName");
	// 规则
	request.id("1");
	request.timeout(TimeValue.timeValueSeconds(1));
	request.timeout("1s");
	request.source(JSON.toJSONString(user),XContentType.JSON);
	// 发送请求
	IndexResponse indexResponse = restHighLevelClient.index(request,RequestOptions.DEFAULT);
	System.out.println(indexResponse.toString());
	RestStatus Status = indexResponse.status();
	System.out.println(Status == RestStatus.OK || Status ==RestStatus.CREATED);
}

(2)判断某索引下文档id是否存在

@Test
public void testIsExists() throws IOException {
	GetRequest getRequest = new GetRequest("UserName","id");
	// 不获取_source上下文 storedFields
	getRequest.fetchSourceContext(new FetchSourceContext(false));
	getRequest.storedFields("_none_");
	// 判断此id是否存在!
	boolean exists = restHighLevelClient.exists(getRequest,RequestOptions.DEFAULT);
	System.out.println(exists);
}

(3)更加id获取文档记录

@Test
public void testGetDocument() throws IOException {
	GetRequest getRequest = new GetRequest("UserName","id");
	GetResponse getResponse = restHighLevelClient.get(getRequest,RequestOptions.DEFAULT);
	System.out.println(getResponse.getSourceAsString()); // 打印文档内容
	System.out.println(getResponse);
}

(4)更新文档记录

@Test
public void testUpdateDocument() throws IOException {
	UpdateRequest request = new UpdateRequest("UserName","id");
	request.timeout(TimeValue.timeValueSeconds(1));
	request.timeout("1s");
	User user = new User("UserName", age);
	request.doc(JSON.toJSONString(user), XContentType.JSON);
	UpdateResponse updateResponse = restHighLevelClient.update(
	request, RequestOptions.DEFAULT);
	System.out.println(updateResponse.status() == RestStatus.OK);
}

(5)删除文档记录测试

@Test
public void testDelete() throws IOException {
	DeleteRequest request = new DeleteRequest("UserName","id");
	request.timeout(TimeValue.timeValueSeconds(1));
	request.timeout("1s");
	DeleteResponse deleteResponse = restHighLevelClient.delete(request, RequestOptions.DEFAULT);
	System.out.println(deleteResponse.status() == RestStatus.OK);
}

(6)批量添加文档记录测试

@Test
public void testBulkRequest() throws IOException {
	BulkRequest bulkRequest = new BulkRequest();
	bulkRequest.timeout(TimeValue.timeValueMinutes(2));
	bulkRequest.timeout("2m");
	ArrayList<User> userList = new ArrayList<>();
	userList.add(new User("UserName1",3));
	userList.add(new User("UserName2",3));
	userList.add(new User("UserName3",3));
	userList.add(new User("UserOther1",3));
	userList.add(new User("UserOther2",3));
	userList.add(new User("UserOther3",3));
	for (int i =0;i<userList.size();i++){
		bulkRequest.add(new IndexRequest("索引name").id(""+(i+1)).source(JSON.toJSONString(userList.get(i)),XContentType.JSON));
	}
	// bulk
	BulkResponse bulkResponse =
	restHighLevelClient.bulk(bulkRequest,RequestOptions.DEFAULT);
	System.out.println(!bulkResponse.hasFailures());
}

(7)查询测试

/**
* 使用QueryBuilder
* termQuery("key", obj) 完全匹配
* termsQuery("key", obj1, obj2..) 一次匹配多个值
* matchQuery("key", Obj) 单个匹配, field不支持通配符, 前缀具高级特性
* multiMatchQuery("text", "field1", "field2"..); 匹配多个字段, field有通
*配符忒行
* matchAllQuery(); 匹配所有文件
*SearchSourceBuilder:构建高亮
*
*/
@Test
public void testSearch() throws IOException {
	SearchRequest searchRequest = new SearchRequest("索引名");
	//构建搜索条件
	SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
	//source
	// TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name",
"qinjiang1");
	// sourceBuilder.query(termQueryBuilder);
	//分页
	//sourceBuilder.from()
	// sourceBuilder.size()
	//匹配全部的查询
	MatchAllQueryBuilder matchAllQueryBuilder =QueryBuilders.matchAllQuery();
	sourceBuilder.query(matchAllQueryBuilder);
	sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
	searchRequest.source(sourceBuilder);
	SearchResponse response = restHighLevelClient.search(searchRequest,RequestOptions.DEFAULT);
	System.out.println(JSON.toJSONString(response.getHits()));
	System.out.println("================SearchHit==================");
	for (SearchHit documentFields : response.getHits().getHits()) {
		System.out.println(documentFields.getSourceAsMap());
	}
}

到此,发现了一个规律,它们都遵循RestFul风格的
如:
CreateIndexRequest
DeleteReques
UpdateRequest…
都是**Resuqst的格式

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐