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

    科技2024-12-04  28

    目录

    一、简介

    二、关于索引相关API操作

    三、关于文档相关API操作

    四、总结


    一、简介

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

    二、关于索引相关API操作

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

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

    主要分为下面三个步骤:

    创建索引请求;执行索引​​请求;获取索引请求响应结果; @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操作索引以及文档的一些操作,通过详细的示例说明其用法。大体的步骤基本一致:

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

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

    Processed: 0.011, SQL: 8