当前位置: 首页 > article >正文

RestClient操作Elasticsearch

简介

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();
    }
}

http://www.kler.cn/a/467926.html

相关文章:

  • 网络层协议之IP数据包层分片随笔
  • 前端学习DAY31(子元素溢出父元素)
  • JavaScript语言的编程范式
  • 计算机网络 (28)虚拟专用网VPN
  • jenkins入门9--参数化构建
  • 用QT实现 端口扫描工具1
  • 【Java】集合中的List【主线学习笔记】
  • 蓝色简洁引导页网站源码
  • 我们公司只有3个人,一个前端,一个后端
  • Java:基于springboot的高校实习管理系统的设计和开发
  • 浅谈棋牌游戏开发流程二:后端技术选型与基础环境搭建
  • 【SPIE独立出版,首届会议见刊后27天EI检索!高录用】第二届遥感、测绘与图像处理国际学术会议(RSMIP 2025)
  • 数据库高安全—角色权限:角色创建角色管理
  • 永磁同步电机预测模型控制(MPC)
  • 计算机网络 —— 网络编程(套接字深度理解)
  • 【漫话机器学习系列】034.决策树(Decision Tree)
  • Python自学 - 递归函数
  • 中型 UniApp 项目的挑战与突破
  • (九千七-星河襟)椭圆曲线加密(ECC, Elliptic Curve Cryptography)及其例题
  • 软考 高级 架构师 第十 章软件工程3
  • 【童年经典小游戏】使用Python实现经典贪吃蛇游戏
  • 逻辑漏洞(超详细)
  • Linux操作系统下,挂ILA
  • HTML——73.button按钮
  • api接口技术开发按图搜索商品api轻松查询获取商品信息返回值结构
  • 基于Spring Boot的便民医疗服务小程序