简介
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异常则抛出该异常,比如网络连接问题、读写错误等。*/@Testvoid 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异常则抛出该异常,比如网络连接问题、读写错误等。*/@Testvoid 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异常则抛出该异常,比如网络连接问题、读写错误等。*/@Testvoid 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")来构建客户端连接。*/@BeforeEachvoid setUp() {this.client = new RestHighLevelClient(RestClient.builder(HttpHost.create("http://192.168.71.128:9200")));}/*** 在每个测试方法执行之后会被调用的方法,用于清理资源等操作。* 在这里关闭了之前创建的RestHighLevelClient对象,释放与Elasticsearch服务器的连接资源。* @throws IOException 如果在关闭客户端连接过程中出现I/O异常则抛出该异常,比如网络连接关闭错误等。*/@AfterEachvoid 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;@Autowiredprivate IHotelService hotelService;/*** 添加文档(对应mysql数据库中表格的一行记录)* 把数据库表中的一行记录数据存到ES的索引库中* @throws IOException*/@Testvoid 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*/@Testvoid 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*/@Testvoid 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*/@Testvoid testDeleteDocumentById() throws IOException {DeleteRequest request = new DeleteRequest("hotel", "61083");client.delete(request, RequestOptions.DEFAULT);}@BeforeEachvoid setUp(){this.client = new RestHighLevelClient(RestClient.builder(HttpHost.create("http://192.168.71.128:9200")));}@AfterEachvoid tearDown() throws IOException {this.client.close();}
}