首页 > 其他分享 >elasticsearch的RestAPI之操作文档

elasticsearch的RestAPI之操作文档

时间:2025-01-15 13:21:14浏览次数:1  
标签:HotelDoc String RestAPI hotel request private 文档 elasticsearch

RestClient操作文档

新增文档

将DB表中的数据同步到elasticsearch

1)查询数据库

1.1)数据库查询后的结果是一个Hotel类型的对象

 1 @Data
 2 @TableName("tb_hotel")
 3 public class Hotel {
 4     @TableId(type = IdType.INPUT)
 5     private Long id;
 6     private String name;
 7     private String address;
 8     private Integer price;
 9     private Integer score;
10     private String brand;
11     private String city;
12     private String starName;
13     private String business;
14     private String longitude;
15     private String latitude;
16     private String pic;
17 }

2)将查询结果的数据做成DSL语句

2.1)新增文档的DSL语句如下:

POST /{索引库名}/_doc/1
{
    "name": "Jack",
    "age": 21
}

2.2)创建一个与索引库结构吻合

查询结果的结构与索引库结构存在差异:

  • longitude和latitude需要合并为location
 1 @Data
 2 @NoArgsConstructor
 3 public class HotelDoc {
 4     private Long id;
 5     private String name;
 6     private String address;
 7     private Integer price;
 8     private Integer score;
 9     private String brand;
10     private String city;
11     private String starName;
12     private String business;
13     private String location;
14     private String pic;
15 
16     public HotelDoc(Hotel hotel) {
17         this.id = hotel.getId();
18         this.name = hotel.getName();
19         this.address = hotel.getAddress();
20         this.price = hotel.getPrice();
21         this.score = hotel.getScore();
22         this.brand = hotel.getBrand();
23         this.city = hotel.getCity();
24         this.starName = hotel.getStarName();
25         this.business = hotel.getBusiness();
26         this.location = hotel.getLatitude() + ", " + hotel.getLongitude();
27         this.pic = hotel.getPic();
28     }
29 }

3)将DB数据同步到elasticsearch

 1 @Test
 2 void testAddDocument() throws IOException {
 3     // 1.根据id查询酒店数据
 4     Hotel hotel = hotelService.getById(61083L);
 5     // 2.转换为文档类型
 6     HotelDoc hotelDoc = new HotelDoc(hotel);
 7     // 3.将HotelDoc转json
 8     String json = JSON.toJSONString(hotelDoc);
 9 
10     // 1.准备Request对象 POST /hotel/_doc/{id}
11     IndexRequest request = new IndexRequest("hotel").id(hotelDoc.getId().toString());
12     // 2.准备Json文档 {"name": "Jack",    "age": 21}
13     request.source(json, XContentType.JSON);
14     // 3.发送请求
15     client.index(request, RequestOptions.DEFAULT);
16 }

新增文档步骤

  • 创建请求对象IndexRequest
  • 准备请求参数,也就是DSL中的JSON文档
  • 发送请求,通过索引库的操作对象的index方法发送请求

查询文档

1)查询的DSL语句如下:

GET /索引库名/_doc/{id}

查询结果是一个JSON,其中文档放在一个_source属性中,因此解析就是拿到_source,反序列化为Java对象即可。

2)查询文档

@Test
void testGetDocumentById() throws IOException {
    // 1.准备Request
    GetRequest request = new GetRequest("hotel", "61082");
    // 2.发送请求,得到响应
    GetResponse response = client.get(request, RequestOptions.DEFAULT);
    // 3.解析响应结果
    String json = response.getSourceAsString();
  
    HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
    System.out.println(hotelDoc);
}

查询文档步骤

  • 创建请求对象GetRequest
  • 发送请求,通过索引库的操作对象的get方法发送请求,得到响应(GetResponse response)对象
  • 响应是一个JSON,其中文档放在一个_source属性中,通过通过响应对象的getSourceAsString方法获取_source,反序列化为Java对象即可

删除文档

1)DSL:

DELETE /索引库名/_doc/{id}

2)删除文档

1 @Test
2 void testDeleteDocument() throws IOException {
3     // 1.准备Request
4     DeleteRequest request = new DeleteRequest("hotel", "61083");
5     // 2.发送请求
6     client.delete(request, RequestOptions.DEFAULT);
7 }

删除文档步骤

  • 创建请求对象DeleteRequest
  • 发送请求,通过索引库的操作对象的delete方法发送请求

修改文档

修改文档两种方式:

  • 全量修改:本质是先根据id删除,再新增
  • 增量修改:修改文档中的指定字段值

在RestClient的API中,全量修改与新增的API完全一致,判断依据是ID:

  • 如果新增时,ID已经存在,则修改
  • 如果新增时,ID不存在,则新增

修改文档

 1 @Test
 2 void testUpdateDocument() throws IOException {
 3     // 1.准备Request
 4     UpdateRequest request = new UpdateRequest("hotel", "61083");
 5     // 2.准备请求参数
 6     request.doc(
 7         "price", "952",
 8         "starName", "四钻"
 9     );
10     // 3.发送请求
11     client.update(request, RequestOptions.DEFAULT);
12 }

修改文档步骤

  • 创建请求对象UpdateRequest
  • 准备参数。也就是JSON文档,包含要修改的字段
  • 发送请求,通过索引库的操作对象的update方法发送请求

批量导入文档

案例需求:利用BulkRequest批量将数据库数据导入到索引库中

步骤如下:

  • 利用mybatis-plus查询酒店数据

  • 将查询到的酒店数据(Hotel)转换为文档类型数据(HotelDoc)

  • 利用JavaRestClient中的BulkRequest批处理,实现批量新增文档

语法说明

批量处理BulkRequest,其本质就是将多个普通的CRUD请求组合在一起发送。

 

可以看到,能添加的请求包括:

  • IndexRequest,也就是新增
  • UpdateRequest,也就是修改
  • DeleteRequest,也就是删除

因此Bulk中添加了多个IndexRequest,就是批量新增功能了。示例:

 1 @Test
 2     void testBulkRequest() throws IOException {
 3         // 查询所有的酒店数据
 4         List<Hotel> list = hotelService.list();
 5 
 6         // 1.准备Request
 7         BulkRequest request = new BulkRequest();
 8         // 2.准备参数
 9         for (Hotel hotel : list) {
10             // 2.1.转为HotelDoc
11             HotelDoc hotelDoc = new HotelDoc(hotel);
12             // 2.2.转json
13             String json = JSON.toJSONString(hotelDoc);
14             // 2.3.添加请求
15             request.add(new IndexRequest("hotel").id(hotel.getId().toString()).source(json, XContentType.JSON));
16         }
17 
18         // 3.发送请求
19         client.bulk(request, RequestOptions.DEFAULT);
20     }

完整代码

@SpringBootTest
class HotelDocumentTest {

    private RestHighLevelClient client;

    @Autowired
    private IHotelService hotelService;

    @Test
    void testAddDocument() throws IOException {
        // 1.查询数据库hotel数据
        Hotel hotel = hotelService.getById(61083L);
        // 2.转换为HotelDoc
        HotelDoc hotelDoc = new HotelDoc(hotel);
        // 3.转JSON
        String json = JSON.toJSONString(hotelDoc);

        // 1.准备Request
        IndexRequest request = new IndexRequest("hotel").id(hotelDoc.getId().toString());
        // 2.准备请求参数DSL,其实就是文档的JSON字符串
        request.source(json, XContentType.JSON);
        // 3.发送请求
        client.index(request, RequestOptions.DEFAULT);
    }

    @Test
    void testGetDocumentById() throws IOException {
        // 1.准备Request      // GET /hotel/_doc/{id}
        GetRequest request = new GetRequest("hotel", "61083");
        // 2.发送请求
        GetResponse response = client.get(request, RequestOptions.DEFAULT);
        // 3.解析响应结果
        String json = response.getSourceAsString();

        HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
        System.out.println("hotelDoc = " + hotelDoc);
    }

    @Test
    void testDeleteDocumentById() throws IOException {
        // 1.准备Request      // DELETE /hotel/_doc/{id}
        DeleteRequest request = new DeleteRequest("hotel", "61083");
        // 2.发送请求
        client.delete(request, RequestOptions.DEFAULT);
    }

    @Test
    void testUpdateById() throws IOException {
        // 1.准备Request
        UpdateRequest request = new UpdateRequest("hotel", "61083");
        // 2.准备参数
        request.doc(
                "price", "870"
        );
        // 3.发送请求
        client.update(request, RequestOptions.DEFAULT);
    }

    @Test
    void testBulkRequest() throws IOException {
        // 查询所有的酒店数据
        List<Hotel> list = hotelService.list();

        // 1.准备Request
        BulkRequest request = new BulkRequest();
        // 2.准备参数
        for (Hotel hotel : list) {
            // 2.1.转为HotelDoc
            HotelDoc hotelDoc = new HotelDoc(hotel);
            // 2.2.转json
            String json = JSON.toJSONString(hotelDoc);
            // 2.3.添加请求
            request.add(new IndexRequest("hotel").id(hotel.getId().toString()).source(json, XContentType.JSON));
        }

        // 3.发送请求
        client.bulk(request, RequestOptions.DEFAULT);
    }

    @BeforeEach
    void setUp() {
        client = new RestHighLevelClient(RestClient.builder(
                HttpHost.create("http://192.168.232.128:9200")
        ));
    }

    @AfterEach
    void tearDown() throws IOException {
        client.close();
    }
}
View Code

 

标签:HotelDoc,String,RestAPI,hotel,request,private,文档,elasticsearch
From: https://www.cnblogs.com/WarBlog/p/18672582

相关文章

  • 从零到一:企业如何选择合适的文档协作工具
    高效的团队协作是企业成功的重要驱动力,而团队文档工具在其中扮演着关键角色。近年来,SaaS(软件即服务)模式的迅猛发展,不仅让文档工具更易用、更智能,也从根本上提升了企业效率。本文将从SaaS视角探讨团队文档工具如何赋能企业发展。一、团队文档工具如何赋能企业效率1.高效协作的......
  • Addresstool统一地址治理官方文档
    Addresstool统一地址治理官方文档一、引言在数字化进程中,地址数据的有效治理至关重要。Addresstool作为一款专业的地址处理工具,致力于解决地址管理中的诸多难题,实现统一地址治理,提升地址数据的质量与应用价值,为各类业务提供坚实的数据支撑。二、Addresstool核心功能(一)......
  • 基于JAVA学生信息管理系统设计与实现(源码+文档 )
    目录一.研究目的二.需求分析三.数据库设计 四.系统页面展示五.免费源码获取方式一.研究目的信息数据的处理完全依赖人工进行操作,会耗费大量的人工成本,特别是面对大量的数据信息时,传统人工操作不仅不能对数据的出错率进行保证,还容易出现各种信息资源的低利用率与低安全......
  • 基于Java的愤怒的小鸟游戏的设计与实现【源码+文档+部署讲解】
    目录摘要Abstract1 绪论1.1游戏开发的背景1.2典型的Java游戏介绍1.2.1Minecraft介绍1.2.2SuperMarioBros介绍1.2.3 TheSims介绍1.3 游戏开发的意义2开发环境2.1开发语言2.2开发工具2.3JDK介绍2.4Java Awt介绍2.5 Java Swi......
  • PDF Automation文档页面自动化工具
    PDFAutomation是我用VB6开发的一个PDF文档页面自动化工具。电脑必须安装了AdobeAcrobat才能使用该工具。软件的主要功能包括:文档的拆分文档的合并页面的删除页面的移动页面的插入等。软件界面正中央的区域是文档列表,也就是多个PDF文档,最右侧是页面列表,显示当前所选文......
  • Qt/C++ 基于回调模式的海康3D相机开发流程详解(附工程源码、开发文档下载链接)
    本文将基于海康3D相机SDK的回调模式,通过具体代码讲解如何完成从设备初始化到图像采集的完整流程。以下是标准的流程图和具体的开发步骤。一、开发流程概述流程分为以下几个关键步骤:运行环境初始化:调用MV3D_LP_Initialize(),初始化SDK运行环境。设备发现:调用MV3D_LP_Get......
  • 批量生成并打印文档Excel2Word
    Excel2Word是一款利用Excel数据生成Word文档的工具。 使用过程主要分为两部分:Word模板制作批量生成Word(生成、保存、打印可选) 其中Word模板制作,是在Word模板中插入书签,并且与Excel标题行的列名关联。批量生成Word,是在Excel中选中多行,然后点击生成即可。 以下结......
  • 推荐1款Word文档批量重命名工具,建议使用起来!
    聊一聊有时候需要批量给word文档设置密码。有时候需要对wrod文档批量重新设置标题。有时候还需要对word文档标题进行批量修改。更有时候还需要将word文档第一段容易做标题。今天给大家分享的这款工具就可以满足上面的所有要求。软件介绍1.Word文档批量重命名工具该工......
  • 【Elasticsearch复合查询】
    Elasticsearch复合查询在Elasticsearch中,复合查询(CompoundQueries)是用来封装其他复合查询或叶子查询的查询类型。它们的主要目的是组合这些查询的结果和分数、改变它们的行为或者从查询上下文切换到过滤上下文。一个常见的复合查询是bool查询,它允许你通过布尔逻辑组合多......
  • 【含文档+PPT+源码】基于大数据的交通流量预测系统
    项目介绍本课程演示的是一款基于Python的图书管理系统的设计与实现,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。包含:项目源码、项目文档、数据库脚本、软件工具等所有资料带你从零开始部署运行本套系统该项目附带的源码资料可作为毕设使用......