带你读《Elastic Stack 实战手册》之67:——3.5.19.3.Elasticsearch语言开发(Java)(下)

本文涉及的产品
Elasticsearch Serverless通用抵扣包,测试体验金 200元
简介: 带你读《Elastic Stack 实战手册》之67:——3.5.19.3.Elasticsearch语言开发(Java)(下)


《Elastic Stack 实战手册》——三、产品能力——3.5 进阶篇——3.5.19.Elasticsearch语言开发(Python/Nodejs/Java)——3.5.19.3.Elasticsearch语言开发(Java)(上) https://developer.aliyun.com/article/1226559



三、常见 API 使用

 

以下将围绕一个名为 posts 的索引进行常用 API 介绍。

 

1. Index API

 

向 posts 索引中写入一条数据。


public static void index() throws IOException {
    //构建 IndexRequest 并设置索引名称
    IndexRequest request = new IndexRequest("posts");
    //文档 id (可选,若不指定,ES 会主动生成)
    request.id("1");
//设置文档内容 此处选择以 JSON 字符串的形式构建文档内容,
  //其还支持 XContentBuilder、Map、Object key-pairs 的形式
    String jsonString = "{" +
            "\"user\":\"kimchy\"," +
            "\"postDate\":\"2021-11-09\"," +
            "\"message\":\"trying out Elasticsearch\"" +
            "}";
    request.source(jsonString, XContentType.JSON);
    IndexResponse indexResponse =
            client.index(request, RequestOptions.DEFAULT);
    System.out.println(indexResponse);
}

结果输出:

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

2. Update API

 

将索引 posts 中 id 为1的文档 message 值更新为 "trying out update"。


public static void update() throws IOException {
    //构建 UpdateRequest 设置索引名称和文档 id
     UpdateRequest request = new UpdateRequest("posts", "1");
    //设置更新内容 构建形式可类比 Index API
    String jsonString = "{" +
            "\"message\":\"trying out Update\"" +
            "}";
    request.doc(jsonString, XContentType.JSON);
    //upsert 方法可以实现文档存在则更新,不存在则新增的效果。
    //request.upsert(jsonString, XContentType.JSON);
UpdateResponse updateResponse =     client.update(request, RequestOptions.DEFAULT);
    System.out.println(updateResponse);
}

 结果输出:

 

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


3. Update By Query API

 

将索引 posts 中所有 user=kimchy 的文档 message 值更新为 "trying out UpdateByQuery"。此 API 需要用到 script 方式进行更新。


public static void updateByQuery() throws IOException {
    //构建 UpdateByQueryRequest 并设置索引名称
    UpdateByQueryRequest request = new UpdateByQueryRequest("posts");
    //版本冲突时继续执行
    request.setConflicts("proceed");
    //查询条件
    request.setQuery(new TermQueryBuilder("user", "kimchy"));
    //设置更新脚本
    Map<String, Object> params = new HashMap<>();
    params.put("message", "trying out UpdateByQuery");
    Script script = new Script(ScriptType.INLINE,
            "painless",
            "ctx._source.message = params.message", params);
    request.setScript(script);
    BulkByScrollResponse bulkResponse =
            client.updateByQuery(request, RequestOptions.DEFAULT);
    System.out.println(bulkResponse);
}

结果输出:

BulkByScrollResponse[took=394ms,timed_out=false,sliceId=null,updated=1
,created=0,deleted=0,batches=1,versionConflicts=0,noops=0,retries=0
,throttledUntil=0s,bulk_failures=[],search_failures=[]]

4. Bulk API

 

对 posts 索引批量执行写入、更新、删除的操作。


public static void bulk() throws IOException {
    //构建 BulkRequest 
    // 可添加多个DeleteRequest、UpdateRequest、IndexRequest
    BulkRequest request = new BulkRequest();
    String jsonString = "{" +
            "\"user\":\"radish\"," +
            "\"postDate\":\"2021-11-09\"," +
            "\"message\":\"trying out bulk\"" +
            "}";
    request.add(new IndexRequest("posts").id("2")
            .source(jsonString, XContentType.JSON));
//        request.add(new DeleteRequest("posts", "1"));
    request.add(new UpdateRequest("posts", "1")
            .doc(XContentType.JSON, "message", "trying out bulk"));
    BulkResponse bulkResponse = 
            client.bulk(request, RequestOptions.DEFAULT);
    System.out.println("bulk result:" + bulkResponse.hasFailures());
}

结果输出:

bulk hasFailures:false

5. Get API

 

获取 posts 索引中 id 为1的文档。


public static void get() throws IOException {
    //构建 GetRequest 并设置索引名称和文档 id
    GetRequest getRequest = new GetRequest("posts", "1");
    GetResponse getResponse 
    = client.get(getRequest, RequestOptions.DEFAULT);
    Map<String, Object> sourceAsMap = getResponse.getSourceAsMap();
    System.out.println(sourceAsMap);

结果输出:

 

{postDate=2021-11-09, message=trying out Elasticsearch, user=kimchy}

6. Search API

 

对 posts 进行所有文档搜索。


public static void search() throws IOException {
    //构建 SearchRequest 并设置索引名称
    SearchRequest searchRequest = new SearchRequest("posts");
    //设置搜索条件
    SearchSourceBuilder searchSourceBuilder 
    = new SearchSourceBuilder();
  //此处设置查询条件,应根据实际需求设置
searchSourceBuilder.query(QueryBuilders.matchAllQuery());
public static void search() throws IOException {
    //构建 SearchRequest 并设置索引名称
    SearchRequest searchRequest = new SearchRequest("posts");
    //设置搜索条件
    SearchSourceBuilder searchSourceBuilder 
    = new SearchSourceBuilder();
  //此处设置查询条件,应根据实际需求设置
searchSourceBuilder.query(QueryBuilders.matchAllQuery());

结果输出:


{postDate=2021-11-09, message=trying out bulk, user=kimchy}
{postDate=2021-11-09, message=trying out bulk, user=radish}

7. Delete API

 

删除 posts 索引 id 为1的文档。


public static void delete() throws IOException {
    //构建 DeleteRequest 并设置索引名称和文档 ID
    DeleteRequest request = new DeleteRequest("posts", "1");
    DeleteResponse deleteResponse 
    = client.delete(request, RequestOptions.DEFAULT);
     System.out.println(deleteResponse);
}

 结果输出:

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

8、DeleteByQuery API

 

删除索引 posts 中所有 user=radish 的文档。


public static void deleteByQuery() throws IOException {
    //构建 DeleteByQueryRequest 并指定索引名称
    DeleteByQueryRequest request = new DeleteByQueryRequest("posts");
    request.setQuery(new TermQueryBuilder("user", "radish"));
    BulkByScrollResponse bulkResponse 
    = client.deleteByQuery(request, RequestOptions.DEFAULT);
    System.out.println(bulkResponse);
}

结果输出:

BulkByScrollResponse[took=13ms,timed_out=false,sliceId=null,updated=0
,created=0,deleted=0,batches=0,versionConflicts=0,noops=0,retries=0
,throttledUntil=0s,bulk_failures=[],search_failures=[]]

四、完整示例

 

本节所涉及的代码示例均在此 github 仓库中:

https://github.com/lixueyu001/elasticsearch-java

 

参考

 

l https://www.elastic.co/guide/en/elasticsearch/client/java-rest/7.10/java-rest-high.html

 

相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。 &nbsp;
相关文章
|
14天前
|
消息中间件 人工智能 Java
抖音微信爆款小游戏大全:免费休闲/竞技/益智/PHP+Java全筏开源开发
本文基于2025年最新行业数据,深入解析抖音/微信爆款小游戏的开发逻辑,重点讲解PHP+Java双引擎架构实战,涵盖技术选型、架构设计、性能优化与开源生态,提供完整开源工具链,助力开发者从理论到落地打造高留存、高并发的小游戏产品。
|
14天前
|
存储 Java 关系型数据库
Java 项目实战基于面向对象思想的汽车租赁系统开发实例 汽车租赁系统 Java 面向对象项目实战
本文介绍基于Java面向对象编程的汽车租赁系统技术方案与应用实例,涵盖系统功能需求分析、类设计、数据库设计及具体代码实现,帮助开发者掌握Java在实际项目中的应用。
36 0
|
2月前
|
安全 Java 数据库
Java 项目实战病人挂号系统网站设计开发步骤及核心功能实现指南
本文介绍了基于Java的病人挂号系统网站的技术方案与应用实例,涵盖SSM与Spring Boot框架选型、数据库设计、功能模块划分及安全机制实现。系统支持患者在线注册、登录、挂号与预约,管理员可进行医院信息与排班管理。通过实际案例展示系统开发流程与核心代码实现,为Java Web医疗项目开发提供参考。
100 2
|
2月前
|
JavaScript 安全 前端开发
Java开发:最新技术驱动的病人挂号系统实操指南与全流程操作技巧汇总
本文介绍基于Spring Boot 3.x、Vue 3等最新技术构建现代化病人挂号系统,涵盖技术选型、核心功能实现与部署方案,助力开发者快速搭建高效、安全的医疗挂号平台。
141 3
|
2月前
|
移动开发 Cloud Native 安全
Java:跨平台之魂,企业级开发的磐石
Java:跨平台之魂,企业级开发的磐石
|
2月前
|
安全 Oracle Java
JAVA高级开发必备·卓伊凡详细JDK、JRE、JVM与Java生态深度解析-形象比喻系统理解-优雅草卓伊凡
JAVA高级开发必备·卓伊凡详细JDK、JRE、JVM与Java生态深度解析-形象比喻系统理解-优雅草卓伊凡
194 0
JAVA高级开发必备·卓伊凡详细JDK、JRE、JVM与Java生态深度解析-形象比喻系统理解-优雅草卓伊凡
|
3月前
|
并行计算 Java API
Java List 集合结合 Java 17 新特性与现代开发实践的深度解析及实战指南 Java List 集合
本文深入解析Java 17中List集合的现代用法,结合函数式编程、Stream API、密封类、模式匹配等新特性,通过实操案例讲解数据处理、并行计算、响应式编程等场景下的高级应用,帮助开发者提升集合操作效率与代码质量。
136 1
|
3月前
|
安全 Java API
Java 17 及以上版本核心特性在现代开发实践中的深度应用与高效实践方法 Java 开发实践
本项目以“学生成绩管理系统”为例,深入实践Java 17+核心特性与现代开发技术。采用Spring Boot 3.1、WebFlux、R2DBC等构建响应式应用,结合Record类、模式匹配、Stream优化等新特性提升代码质量。涵盖容器化部署(Docker)、自动化测试、性能优化及安全加固,全面展示Java最新技术在实际项目中的应用,助力开发者掌握现代化Java开发方法。
129 1
|
3月前
|
IDE Java API
Java 17 新特性与微服务开发的实操指南
本内容涵盖Java 11至Java 17最新特性实战,包括var关键字、字符串增强、模块化系统、Stream API、异步编程、密封类等,并提供图书管理系统实战项目,帮助开发者掌握现代Java开发技巧与工具。
172 1

相关产品

  • 检索分析服务 Elasticsearch版