简介
Elasticsearch
Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。Elasticsearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
RestClient
ES官方提供的用Java语言来操作ES的客户端
前置条件
使用前需引入RestClient依赖,下面以7.12.1版本为例
<!--elasticsearch-->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.12.1</version>
</dependency>
注意版本需要和安装的ES版本保持一致
基本操作
操作索引库
import org.apache.http.HttpHost;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CloseIndexRequest;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.xcontent.XContentType;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import java.io.IOException;
import static cn.itcast.hotel.constants.HotelConstants.MAPPING_TEMPLATE;
public class HotelIndexTest {
// 用于与Elasticsearch进行高级别RESTful API交互的客户端对象
private RestHighLevelClient client;
/**
* 测试方法:用于创建酒店索引(hotel index)。
* 步骤如下:
* 1. 创建一个CreateIndexRequest对象,指定要创建的索引名称为"hotel"。
* 2. 准备请求的参数,将预定义的映射模板(MAPPING_TEMPLATE,应该是符合Elasticsearch索引映射格式的JSON字符串)设置到请求中,指定内容类型为JSON格式。
* 3. 使用客户端对象发送创建索引的请求到Elasticsearch服务器。
* @throws IOException 如果在请求发送过程中出现I/O异常则抛出该异常,比如网络连接问题、读写错误等。
*/
@Test
void createHotelIndex() throws IOException {
// 1.创建Request对象
CreateIndexRequest request = new CreateIndexRequest("hotel");
// 2.准备请求的参数
request.source(MAPPING_TEMPLATE, XContentType.JSON);
// 3.发送请求
client.indices().create(request, RequestOptions.DEFAULT);
}
/**
* 测试方法:用于删除酒店索引(hotel index)。
* 步骤如下:
* 1. 创建一个DeleteIndexRequest对象,指定要删除的索引名称为"hotel"。
* 3. 使用客户端对象发送删除索引的请求到Elasticsearch服务器。
* @throws IOException 如果在请求发送过程中出现I/O异常则抛出该异常,比如网络连接问题、读写错误等。
*/
@Test
void testDeleteHotelIndex() throws IOException {
// 1.创建Request对象
DeleteIndexRequest request = new DeleteIndexRequest("hotel");
// 3.发送请求
client.indices().delete(request, RequestOptions.DEFAULT);
}
/**
* 测试方法:用于检查酒店索引(hotel index)是否存在。
* 步骤如下:
* 1. 创建一个GetIndexRequest对象,指定要检查的索引名称为"hotel"。
* 3. 使用客户端对象发送检查索引是否存在的请求到Elasticsearch服务器,获取返回的布尔值结果(表示是否存在),然后根据结果输出相应的提示信息。
* @throws IOException 如果在请求发送过程中出现I/O异常则抛出该异常,比如网络连接问题、读写错误等。
*/
@Test
void testExistHotelIndex() throws IOException {
// 1.创建Request对象
GetIndexRequest request = new GetIndexRequest("hotel");
// 3.发送请求
boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
System.err.println(exists? "索引库已经存在!" : "索引库不存在!");
}
/**
* 在每个测试方法执行之前会被调用的方法,用于初始化操作。
* 在这里创建了一个RestHighLevelClient对象,该对象用于与Elasticsearch服务器进行通信。
* 通过指定Elasticsearch服务器的地址(这里是"http://192.168.71.128:9200")来构建客户端连接。
*/
@BeforeEach
void setUp() {
this.client = new RestHighLevelClient(RestClient.builder(
HttpHost.create("http://192.168.71.128:9200")
));
}
/**
* 在每个测试方法执行之后会被调用的方法,用于清理资源等操作。
* 在这里关闭了之前创建的RestHighLevelClient对象,释放与Elasticsearch服务器的连接资源。
* @throws IOException 如果在关闭客户端连接过程中出现I/O异常则抛出该异常,比如网络连接关闭错误等。
*/
@AfterEach
void tearDown() throws IOException {
this.client.close();
}
}
操作文档
import cn.itcast.hotel.pojo.Hotel;
import cn.itcast.hotel.pojo.HotelDoc;
import cn.itcast.hotel.service.IHotelService;
import com.alibaba.fastjson.JSON;
import org.apache.http.HttpHost;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
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.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.xcontent.XContentType;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.IOException;
import static cn.itcast.hotel.constants.HotelConstants.MAPPING_TEMPLATE;
@SpringBootTest
public class HotelDocumentTest {
private RestHighLevelClient client;
@Autowired
private IHotelService hotelService;
/**
* 添加文档(对应mysql数据库中表格的一行记录)
* 把数据库表中的一行记录数据存到ES的索引库中
* @throws IOException
*/
@Test
void testAddDocument() throws IOException {
Hotel hotel = hotelService.getById(61083L);
// 转换为文档类型
HotelDoc hotelDoc = new HotelDoc(hotel);
//1.准备Request对象
IndexRequest request = new IndexRequest("hotel").id(hotel.getId().toString());
//2.准备Json文档
request.source(JSON.toJSONString(hotelDoc),XContentType.JSON);
//3.发送请求
client.index(request,RequestOptions.DEFAULT);
}
/**
* 根据文档id获取文档
* @throws IOException
*/
@Test
void testGetDocumentById() throws IOException {
//准备request对象
GetRequest request = new GetRequest("hotel","61083");
GetResponse response = client.get(request, RequestOptions.DEFAULT);
String json = response.getSourceAsString();
HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
System.out.println(hotelDoc);
}
/**
* 更新文档,对字段进行增删改查
* @throws IOException
*/
@Test
void testUpdateDocumentById() throws IOException {
UpdateRequest request = new UpdateRequest("hotel", "61083");
request.doc(
"price","999",
"starName","四钻",
"dd","123"
);
UpdateResponse update = client.update(request, RequestOptions.DEFAULT);
}
/**
* 删除文档
* @throws IOException
*/
@Test
void testDeleteDocumentById() throws IOException {
DeleteRequest request = new DeleteRequest("hotel", "61083");
client.delete(request, RequestOptions.DEFAULT);
}
@BeforeEach
void setUp(){
this.client = new RestHighLevelClient(RestClient.builder(
HttpHost.create("http://192.168.71.128:9200")
));
}
@AfterEach
void tearDown() throws IOException {
this.client.close();
}
}