zoukankan      html  css  js  c++  java
  • Elasticsearch学习笔记3 -- 文档操作

    文档操作

    新增文档

    语法:

    POST /索引库名/_doc/文档id
    {
        "字段1": "值1",
        "字段2": "值2",
        "字段3": {
            "子属性1": "值3",
            "子属性2": "值4"
        },
        // ...
    }
    

    示例:

    POST /student/_doc/1
    {
      "name": "小明",
      "age": 13,
      "info": "地球人",
      "hobby": "打篮球"
    }
    

    查询文档

    根据rest风格,新增是post,查询应该是get,不过查询一般都需要条件,这里我们把文档id带上。

    语法:

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

    通过kibana查看数据:

    GET /student/_doc/1
    

    删除文档

    删除使用DELETE请求,同样,需要根据id进行删除:

    语法:

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

    示例:

    # 根据id删除数据
    DELETE /student/_doc/1
    

    修改文档

    修改有两种方式:

    • 全量修改:直接覆盖原来的文档
    • 增量修改:修改文档中的部分字段

    全量修改

    全量修改是覆盖原来的文档,其本质是:

    • 根据指定的id删除文档
    • 新增一个相同id的文档

    注意:如果根据id删除时,id不存在,第二步的新增也会执行,也就从修改变成了新增操作了。

    语法:

    PUT /{索引库名}/_doc/文档id
    {
        "字段1": "值1",
        "字段2": "值2",
        // ... 略
    }
    
    

    示例:

    PUT /student/_doc/1
    {
        "name": "大大",
        "age":16,
        // 略...
    }
    

    增量修改

    增量修改是只修改指定id匹配的文档中的部分字段。

    语法:

    POST /{索引库名}/_update/文档id
    {
        "doc": {
             "字段名": "新的值",
        }
    }
    

    示例:

    POST /student/_update/1
    {
      "doc": {
        "email": "test@itcast.cn"
      }
    }
    

    总结

    文档操作有哪些?

    • 创建文档:POST /{索引库名}/_doc/文档id { json文档 }
    • 查询文档:GET /{索引库名}/_doc/文档id
    • 删除文档:DELETE /{索引库名}/_doc/文档id
    • 修改文档:
      • 全量修改:PUT /{索引库名}/_doc/文档id { json文档 }
      • 增量修改:POST /{索引库名}/_update/文档id { "doc": {字段}}

    Java代码对应实现

    在实际开发中,es中的索引库对应的是数据库中的表,比如MySQL,而且数据必须是同步的,如果是增删改那就需要对数据库表的操作,而查询的话则直接从es中查询,速度快效率高。但是,要注意的是,索引库中的字段和数据库表中的不一定完全对应,比如位置,数据库表中要设计两个字段,一个是经度一个是纬度,而es中只有一个字段。

    RestClient操作文档

    环境搭建

    索引库实体类

    数据库查询后的结果是一个Student类型的对象。结构如下:

    @Data
    @TableName("student")
    public class Student {
        @TableId(value = "id")
        private Integer id;
        private String name;
        private String info;
        private String hobby;
        private Integer age;
    }
    

    如果结构不一样,需要从新定义一个类与之吻合。

    属性注入给对象赋值

    注入client和service对象,如下:

    @Resource
    private RestHighLevelClient client;
    @Resource
    private IStudentService service;
    

    具体实现

    新增文档

    我们要将数据库的学生数据查询出来,写入elasticsearch中。

    @Test
    void testInsertDoc() throws IOException {
        // 根据id从数据库中获取对应的数据
        Student student = service.getById(1);
        // 将其转换为json格式
        String json = JSON.toJSONString(student);
        // 创建request对象,但不再是GetIndex....  CreateIndex...因为不是对索引库的操作,而是对文档的操作
        // 需要指定id,keyword类型
        IndexRequest request = new IndexRequest("student").id(student.getId().toString());
        // 准备json文档
        request.source(json, XContentType.JSON);
        // 发送请求
        client.index(request, RequestOptions.DEFAULT);
    }
    

    查询文档

    查询的DSL语句如下:

    GET /hotel/_doc/{id}
    

    非常简单,因此代码大概分两步:

    • 准备Request对象
    • 发送请求

    不过查询的目的是得到结果,解析为Student,因此难点是结果的解析。如图:

    image-20211011213829071

    与之前类似,也是三步走:

    1. 准备Request对象。这次是查询,所以是GetRequest。

    2. 发送请求,得到结果。因为是查询,这里调用client.get()方法。

    3. 解析结果,就是对JSON做反序列化。

    @Test
    void testSelectDoc() throws IOException {
        // 准备request对象
        GetRequest request = new GetRequest("student", "1");
        // 使用client发送请求得到相应
        GetResponse response = client.get(request, RequestOptions.DEFAULT);
        // 查询的目的是得到结果,解析响应结果。
        // 其中文档放在一个`_source`属性中,因此解析就是拿到`_source`,反序列化为Java对象即可。
        String json = response.getSourceAsString();
        // 反序列化转为Student对象
        Student student = JSON.parseObject(json, Student.class);
        // 输出
        System.out.println(student);
    }
    

    删除文档

    删除的DSL为是这样的:

    DELETE /hotel/_doc/{id}
    

    与查询相比,仅仅是请求方式从DELETE变成GET,可以想象Java代码应该依然是三步走:

    • 1)准备Request对象,因为是删除,这次是DeleteRequest对象。要指定索引库名和id
    • 2)准备参数,无参
    • 3)发送请求。因为是删除,所以是client.delete()方法

    编写单元测试:

    @Test
    void testDeleteDoc() throws IOException {
        // 1.准备Request
        DeleteRequest request = new DeleteRequest("student", "1");
        // 2.发送请求
        client.delete(request, RequestOptions.DEFAULT);
    }
    

    修改文档

    语法说明

    修改我们讲过两种方式:

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

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

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

    主要关注增量修改,代码示例如图:

    image-20211011214941978

    与之前类似,也是三步走:

    1. 准备Request对象。这次是修改,所以是UpdateRequest

    2. 准备参数。也就是JSON文档,里面包含要修改的字段

    3. 更新文档。这里调用client.update()方法

    @Test
    void testUpdateDoc() throws IOException {
        // 创建request对象
        UpdateRequest request = new UpdateRequest("student", "1");
        // 参数准备,每两个参数是一对,中间不是冒号也不是等号。
        request.doc(
            "address", "上海"
        );
        // 发送请求
        client.update(request, RequestOptions.DEFAULT);
    }
    

    批量导入文档

    也就是将数据库表中数据一次性全部插入到es中,具体实现就是查询数据封装到集合当中,然后循环集合,每循环一次就发送一次添加文档请求。

    语法说明

    批量处理BulkRequest,其本质就是将多个普通的CRUD请求组合在一起发送。也就是说可以将多个请求封装在一起,导入数据就是多个添加文档操作封装在一起,同样,也可以先添加,再查询,最后删除。

    其中提供了一个add方法,用来添加其他请求:

    image-20210720232105943

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

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

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

    image-20210720232431383

    其实还是三步走:

    • 1)创建Request对象。这里是BulkRequest
    • 2)准备参数。批处理的参数,就是其它Request对象,这里就是多个IndexRequest
    • 3)发起请求。这里是批处理,调用的方法为client.bulk()方法

    我们在学生数据时,将上述代码改造成for循环处理即可。

    @Test
    void testBulkRequest() throws IOException {
        // 批量查询酒店数据
        List<Student> students = service.list();
    
        // 1.创建Request
        BulkRequest request = new BulkRequest();
        // 2.准备参数,添加多个新增的Request
        for (Student stu : students) {
            // 2.2.创建新增文档的Request对象
            request.add(new IndexRequest("student")
                        .id(stu.getId().toString())
                        .source(JSON.toJSONString(stu), XContentType.JSON));
        }
        // 3.发送请求
        client.bulk(request, RequestOptions.DEFAULT);
    }
    
  • 相关阅读:
    微信小程序 单选按钮 最佳
    微信小程序 单选按钮的实现
    微信小程序 单选框实现
    Java Code To Create Pyramid and Pattern
    Java language
    npm Err! Unexpected end of JSON input while parsing near
    Node.js Express FrameWork Tutorial
    Higher-Order Function Examples
    Create First HTTP Web Server in Node.js: Complete Tutorial
    Node.js NPM Tutorial: Create, Publish, Extend & Manage
  • 原文地址:https://www.cnblogs.com/dcy521/p/15395269.html
Copyright © 2011-2022 走看看