ElasticSearch全文搜索引擎之索引和文档的API操作详解

目录

一、简介

二、关于索引相关API操作

三、关于文档相关API操作

四、总结


一、简介

前面一篇文章我们已经实现了es整合springboot项目,本篇文章将总结关于高级客户端API操作索引和文档的一些操作。

二、关于索引相关API操作

在es中,很多API操作都是基于RestHighLevelClient对象来进行,下面我们通过几个常见示例说明其用法。

【a】创建一个名为"student_info"的索引库

主要分为下面三个步骤:

  1. 创建索引请求;
  2. 执行索引​​请求;
  3. 获取索引请求响应结果;
@SpringBootTest
class WshElasticsearchApiApplicationTests {

    @Autowired
    private RestHighLevelClient restHighLevelClient;

    /**
     * 测试创建索引
     */
    @Test
    void createIndex() {
        //创建索引请求
        CreateIndexRequest studentInfoIndexRequest = new CreateIndexRequest("student_info");
        //执行请求
        try {
            //获取响应
            CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(studentInfoIndexRequest, RequestOptions.DEFAULT);
            System.out.println(createIndexResponse);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

执行单元测试:

如上图,成功创建索引。 

【b】判断索引库是否存在

@Test
    void existsIndex() {
        //创建获取索引的请求
        GetIndexRequest getIndexRequest = new GetIndexRequest("student_info");
        boolean exists = false;
        try {
            //执行请求,获取响应结果
            exists = restHighLevelClient.indices().exists(getIndexRequest, RequestOptions.DEFAULT);
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println(exists);
    }

控制台输出日志如下:

 

可以看到,我们的索引库student_info存在。 

【c】删除索引库

@Test
    void deleteIndex() {
        //创建删除索引的请求
        DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("student_info");
        //执行请求,获取响应结果
        AcknowledgedResponse acknowledgedResponse = null;
        try {
            acknowledgedResponse = restHighLevelClient.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println(acknowledgedResponse);
    }

 控制台输出日志如下:

可以看到,成功删除索引库student_info,es-head中也查看不到student_info的索引了。

三、关于文档相关API操作

【a】添加文档

首先,我们先创建一个"student_info"的索引库:

创建完成后,我们需要创建一个实体类Student用于模拟插入数据:

package com.wsh.elasticsearch.wshelasticsearchapi.entity;

import org.springframework.stereotype.Component;

@Component
public class Student {
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

pom.xml文件中添加json转化工具包fastjson依赖,后面保存数据时需要用到:

 <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.60</version>
        </dependency>

 新建文档:

 @Test
    void createDocument() {
        //创建对象
        Student student = new Student("张三", 30);
        //创建索引请求
        IndexRequest request = new IndexRequest("student_info");
        //设置ID
        request.id("1");
        //设置超时
        request.timeout(TimeValue.timeValueSeconds(1));
        //将数据放入请求(json格式)
        request.source(JSON.toJSONString(student), XContentType.JSON);
        //客户端发送请求
        IndexResponse response = null;
        try {
            //获取响应
            response = restHighLevelClient.index(request, RequestOptions.DEFAULT);
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println(response.toString());
        System.out.println(response.status());
    }

控制台日志输出如下:

IndexResponse[index=student_info,type=_doc,id=1,version=1,result=created,seqNo=0,primaryTerm=1,shards={"total":2,"successful":1,"failed":0}]
CREATED

可以看到数据的状态为CREATE创建状态,创建完成后,我们去es-head中查看索引数据:

可见,文档成功插入到索引库中。

【b】判断文档是否存在

@Test
    void existsDocument() {
        //创建获取文档请求
        GetRequest request = new GetRequest("student_info", "1");
        boolean exists = false;
        try {
            exists = restHighLevelClient.exists(request, RequestOptions.DEFAULT);
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println(exists);
    }

控制台日志输出如下:

可见,ID为1的文档记录存在索引库中。 

【c】获取文档的信息

@Test
    void getDocument() {
        //创建获取文档请求
        GetRequest request = new GetRequest("student_info", "1");
        GetResponse response = null;
        try {
            //获取响应
            response = restHighLevelClient.get(request, RequestOptions.DEFAULT);
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("response: " + response);
        System.out.println("id: " + response.getId());
        System.out.println("index: " + response.getIndex());
        System.out.println("source: " + response.getSource());
        System.out.println("source string: " + response.getSourceAsString());
        System.out.println("version: " + response.getVersion());
        System.out.println("fields: " + response.getFields());
    }

控制台日志输出如下:

response: {"_index":"student_info","_type":"_doc","_id":"1","_version":1,"_seq_no":0,"_primary_term":1,"found":true,"_source":{"age":30,"name":"张三"}}
id: 1
index: student_info
source: {name=张三, age=30}
source string: {"age":30,"name":"张三"}
version: 1
fields: {}

【d】更新文档的信息

@Test
    void updateDocument() {
        //创建更新文档请求
        UpdateRequest request = new UpdateRequest("student_info", "1");
        //设置超时
        request.timeout("1s");
        //创建对象
        Student student = new Student("李四", 40);
        //设置请求体内容
        request.doc(JSON.toJSONString(student), XContentType.JSON);
        UpdateResponse response = null;
        try {
            //执行更新请求,获取响应结果
            response = restHighLevelClient.update(request, RequestOptions.DEFAULT);
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println(response);
    }

控制台日志输出如下:

UpdateResponse[index=student_info,type=_doc,id=1,version=2,seqNo=1,primaryTerm=1,result=updated,shards=ShardInfo{total=2, successful=1, failures=[]}]

更新完成后,我们去es-head中查看索引数据:

可见,数据成功被更新。

【e】删除文档信息

@Test
    void deleteDocument() {
        //创建删除请求
        DeleteRequest request = new DeleteRequest("student_info", "1");
        request.timeout("1s");
        DeleteResponse response = null;
        try {
            //执行删除请求,获取响应结果
            response = restHighLevelClient.delete(request, RequestOptions.DEFAULT);
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println(response);
    }

控制台日志输出如下:

DeleteResponse[index=student_info,type=_doc,id=1,version=3,result=deleted,shards=ShardInfo{total=2, successful=1, failures=[]}]

删除完成后,我们去es-head中查看索引数据:

可见,数据成功被删除。

【f】批量插入数据

@Test
    void bulkRequest() {
        //创建批处理请求
        BulkRequest request = new BulkRequest();
        //设置超时
        request.timeout("15s");
        //创建集合
        List<Student> studentList = new ArrayList<>();
        studentList.add(new Student("张三", 10));
        studentList.add(new Student("李四", 20));
        studentList.add(new Student("王五", 30));
        studentList.add(new Student("赵六", 40));
        studentList.add(new Student("田七", 50));

        for (int i = 0; i < studentList.size(); i++) {
            Student student = studentList.get(i);
            IndexRequest indexRequest = new IndexRequest("student_info")
                    .id((i + 1) + "")
                    .source(JSON.toJSONString(student), XContentType.JSON);
            request.add(indexRequest);
        }

        BulkResponse response = null;
        try {
            response = restHighLevelClient.bulk(request, RequestOptions.DEFAULT);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //是否失败  false表示成功
        System.out.println(response.hasFailures());
        //状态
        System.out.println(response.status());
    }

控制台日志输出如下:

插入完成后,我们去es-head中查看索引数据:

可见,批量插入数据成功。

同理,批量更新、批量删除只是构造的xxxRequest不同而已,其他基本一致。

四、总结

本篇文章主要总结了es高级客户端API操作索引以及文档的一些操作,通过详细的示例说明其用法。大体的步骤基本一致:

  1. 第一步,先构造xxxRequest请求对象,可以设置超时等信息;
  2. 第二部,通过restHighLevelClient对象执行对应的请求;
  3. 第三步,获取执行请求的响应结果进行分析;

更多详细的高级API操作可参考elasticsearch官方文档进行学习,下一篇文章我们将总结一些关于查询相关的API详解。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页
实付 19.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值