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

本文涉及的产品
Elasticsearch Serverless检索通用型,资源抵扣包 100CU*H
简介: SpringBoot 实现 elasticsearch 索引操作(RestHighLevelClient 的应用)

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();
}
相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
3月前
|
存储 弹性计算 运维
海量日志接入 Elasticsearch Serverless 应用降本70%以上
本文将探讨在日志场景下,使用阿里云Elasticsearch Serverless相较于基于ECS自建Elasticsearch集群的成本与性能优势,展示如何通过Serverless架构实现高达 70%以上的成本节约。
253 0
|
4月前
|
人工智能 自然语言处理 搜索推荐
云端问道12期实操教学-构建基于Elasticsearch的企业级AI搜索应用
本文介绍了构建基于Elasticsearch的企业级AI搜索应用,涵盖了从传统关键词匹配到对话式问答的搜索形态演变。阿里云的AI搜索产品依托自研和开源(如Elasticsearch)引擎,提供高性能检索服务,支持千亿级数据毫秒响应。文章重点描述了AI搜索的三个核心关键点:精准结果、语义理解、高性能引擎,并展示了架构升级和典型应用场景,包括智能问答、电商导购、多模态图书及商品搜索等。通过实验部分,详细演示了如何使用阿里云ES搭建AI语义搜索Demo,涵盖模型创建、Pipeline配置、数据写入与检索测试等步骤,同时介绍了相关的计费模式。
106 3
|
4月前
|
人工智能 算法 API
构建基于 Elasticsearch 的企业级 AI 搜索应用
本文介绍了基于Elasticsearch构建企业级AI搜索应用的方案,重点讲解了RAG(检索增强生成)架构的实现。通过阿里云上的Elasticsearch AI搜索平台,简化了知识库文档抽取、文本切片等复杂流程,并结合稠密和稀疏向量的混合搜索技术,提升了召回和排序的准确性。此外,还探讨了Elastic的向量数据库优化措施及推理API的应用,展示了如何在云端高效实现精准的搜索与推理服务。未来将拓展至多模态数据和知识图谱,进一步提升RAG效果。
141 1
|
6月前
|
存储 缓存 监控
优化Elasticsearch 索引设计
优化Elasticsearch 索引设计
88 5
|
6月前
|
存储 SQL 监控
|
6月前
|
自然语言处理 监控 数据可视化
|
6月前
|
存储 JSON 关系型数据库
Elasticsearch 索引
【11月更文挑战第3天】
92 4
|
6月前
|
运维 监控 安全
|
6月前
|
测试技术 API 开发工具
ElasticSearch7.6.x 模板及滚动索引创建及注意事项
ElasticSearch7.6.x 模板及滚动索引创建及注意事项
107 8
|
6月前
|
JSON Java API
springboot集成ElasticSearch使用completion实现补全功能
springboot集成ElasticSearch使用completion实现补全功能
94 1