SpringBoot 实现 elasticsearch 索引操作(RestHighLevelClient 的应用)

简介: RestHighLevelClient 是 Elasticsearch 官方提供的Java高级客户端,用于与Elasticsearch集群进行交互和执行各种操作。主要特点和功能如下:强类型:RestHighLevelClient 提供了强类型的 API,可以在编码过程中获得更好的类型安全性和 IDE 支持。兼容性:RestHighLevelClient 是 Elasticsearch 官方推荐的 Java 客户端,在 Elasticsearch 版本升级时会保证与 Elasticsearch 的兼容性。高级功能:RestHighLevelClient 支持 Elasticsea

RestHighLevelClient 是 Elasticsearch 官方提供的Java高级客户端,用于与Elasticsearch集群进行交互和执行各种操作。


主要特点和功能如下:


强类型:RestHighLevelClient 提供了强类型的 API,可以在编码过程中获得更好的类型安全性和 IDE 支持。


兼容性:RestHighLevelClient 是 Elasticsearch 官方推荐的 Java 客户端,在 Elasticsearch 版本升级时会保证与 Elasticsearch 的兼容性。


高级功能:RestHighLevelClient 支持 Elasticsearch 的所有高级功能,例如索引、搜索、聚合、分页、批量操作、文档更新、删除等操作。


异步执行:RestHighLevelClient 还支持异步方式执行操作,可以通过提供的异步回调方法处理返回结果。


索引管理:RestHighLevelClient 提供了索引管理相关的 API,包括创建索引、映射定义、设置索引的分片和副本等操作。


搜索与聚合:RestHighLevelClient 支持复杂的搜索和聚合操作,可以使用查询条件、过滤条件、排序、范围查询等来获取所需的数据。


安全认证:RestHighLevelClient 支持配置安全认证信息,例如提供用户名和密码进行身份验证。


执行配置:RestHighLevelClient 可以配置连接超时、请求超时、重试策略等执行参数,以满足特定的需求和优化性能。


RestHighLevelClient是一个功能强大的Java客户端,可以轻松地与Elasticsearch集群进行交互,并支持许多高级功能和配置选项。

来实操吧…

0. 引入依赖

<dependency>
  <groupId>org.elasticsearch.client</groupId>
  <artifactId>elasticsearch-rest-high-level-client</artifactId>
  <version>7.12.1</version>
</dependency>

1. 实例创建与关闭

private RestHighLevelClient client;
void setUp() {
    this.client = new RestHighLevelClient(RestClient.builder(
            HttpHost.create("http://IP:9200")
    ));
}
void tearDown() throws IOException {
    this.client.close();
}

2. 创建索引

@RequestMapping("/create")
public String createHotelIndex() throws IOException {
    setUp();
    // 1.创建Request对象 "name" 是需要创建的索引名 一般在项目中只创建一次 所以这里是写死的
    CreateIndexRequest request = new CreateIndexRequest("name");
    // 2.准备请求的参数:DSL语句
    request.source(MAPPING_TEMPLATE, XContentType.JSON);
    // 3.发送请求
    CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);
    tearDown();
    return createIndexResponse.isAcknowledged() ? "创建成功" : "创建失败";
}

3. 测试索引库存在不存在

@RequestMapping("/testExistsHotelIndex/{indexName}")
public String testExistsHotelIndex(@PathVariable("indexName") String indexName) throws IOException {
  setUp();
  // 1.创建Request对象
  GetIndexRequest request = new GetIndexRequest(indexName);
  // 2.发送请求
  boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
  tearDown();
  return exists ? "索引库已经存在!" : "索引库不存在!";
}

4. 删除索引库

@RequestMapping("/testDeleteHotelIndex")
void testDeleteHotelIndex() throws IOException {
    setUp();
    // 1.创建Request对象
    DeleteIndexRequest request = new DeleteIndexRequest("索引名称");
    // 2.发送请求
    client.indices().delete(request, RequestOptions.DEFAULT);
    tearDown();
}

5. 遍历导入数据

不建议遍历导入,这样效率低低

@RequestMapping("/addAll")
public List<HotelDoc> addAll() throws IOException {
    List<Hotel> list = hotelService.list();
    List<HotelDoc> docList = list.stream().map(p -> new HotelDoc(p)).collect(Collectors.toList());
    setUp();
    for (HotelDoc hotelDoc : docList) {
        String jsonString = JSON.toJSONString(hotelDoc);
        // 1.准备Request对象
        IndexRequest request = new IndexRequest("索引名称").id(hotelDoc.getId().toString());
        // 2.准备Json文档
        request.source(jsonString, XContentType.JSON);
        // 3.发送请求
        IndexResponse index = client.index(request, RequestOptions.DEFAULT);
        System.out.println(hotelDoc.getName() + ":" + index.status());
    }
    tearDown();
    return null;
}

6. 批量导入数据(推荐)

@RequestMapping("/testBulkRequest")
public void testBulkRequest() throws IOException {
  List<Hotel> hotels = hotelService.list();
  setUp();
  // 1.创建Request
  BulkRequest request = new BulkRequest();
  // 2.准备参数,添加多个新增的Request
  for (Hotel hotel : hotels) {
    // 2.1.转换为文档类型HotelDoc
    HotelDoc hotelDoc = new HotelDoc(hotel);
    // 2.2.创建新增文档的Request对象
    request.add(new IndexRequest("索引名称")
      .id(hotelDoc.getId().toString())
      .source(JSON.toJSONString(hotelDoc), XContentType.JSON));
  }
  // 3.发送请求
  client.bulk(request, RequestOptions.DEFAULT);
  tearDown();
}

相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。 &nbsp;
相关文章
存储 JSON Java
539 0
|
10月前
|
存储 弹性计算 运维
海量日志接入 Elasticsearch Serverless 应用降本70%以上
本文将探讨在日志场景下,使用阿里云Elasticsearch Serverless相较于基于ECS自建Elasticsearch集群的成本与性能优势,展示如何通过Serverless架构实现高达 70%以上的成本节约。
550 0
|
11月前
|
人工智能 自然语言处理 搜索推荐
云端问道12期实操教学-构建基于Elasticsearch的企业级AI搜索应用
本文介绍了构建基于Elasticsearch的企业级AI搜索应用,涵盖了从传统关键词匹配到对话式问答的搜索形态演变。阿里云的AI搜索产品依托自研和开源(如Elasticsearch)引擎,提供高性能检索服务,支持千亿级数据毫秒响应。文章重点描述了AI搜索的三个核心关键点:精准结果、语义理解、高性能引擎,并展示了架构升级和典型应用场景,包括智能问答、电商导购、多模态图书及商品搜索等。通过实验部分,详细演示了如何使用阿里云ES搭建AI语义搜索Demo,涵盖模型创建、Pipeline配置、数据写入与检索测试等步骤,同时介绍了相关的计费模式。
366 3
|
11月前
|
人工智能 算法 API
构建基于 Elasticsearch 的企业级 AI 搜索应用
本文介绍了基于Elasticsearch构建企业级AI搜索应用的方案,重点讲解了RAG(检索增强生成)架构的实现。通过阿里云上的Elasticsearch AI搜索平台,简化了知识库文档抽取、文本切片等复杂流程,并结合稠密和稀疏向量的混合搜索技术,提升了召回和排序的准确性。此外,还探讨了Elastic的向量数据库优化措施及推理API的应用,展示了如何在云端高效实现精准的搜索与推理服务。未来将拓展至多模态数据和知识图谱,进一步提升RAG效果。
426 1
|
存储 SQL 监控
|
自然语言处理 监控 数据可视化
|
运维 监控 安全
|
JSON Java API
springboot集成ElasticSearch使用completion实现补全功能
springboot集成ElasticSearch使用completion实现补全功能
231 1
|
人工智能
云端问道12期-构建基于Elasticsearch的企业级AI搜索应用陪跑班获奖名单公布啦!
云端问道12期-构建基于Elasticsearch的企业级AI搜索应用陪跑班获奖名单公布啦!
293 2
|
Web App开发 JavaScript Java
elasticsearch学习五:springboot整合 rest 操作elasticsearch的 实际案例操作,编写搜索的前后端,爬取京东数据到elasticsearch中。
这篇文章是关于如何使用Spring Boot整合Elasticsearch,并通过REST客户端操作Elasticsearch,实现一个简单的搜索前后端,以及如何爬取京东数据到Elasticsearch的案例教程。
873 0
elasticsearch学习五:springboot整合 rest 操作elasticsearch的 实际案例操作,编写搜索的前后端,爬取京东数据到elasticsearch中。