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

简介: 带你读《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;
相关文章
|
11月前
|
JSON Java API
【干货满满】分享京东API接口到手价,用Java语言实现
本示例使用 Java 调用京东开放平台商品价格及优惠信息 API,通过商品详情和促销接口获取到手价(含优惠券、满减等),包含签名生成、HTTP 请求及响应解析逻辑,适用于比价工具、电商系统集成等场景。
|
9月前
|
安全 前端开发 Java
《深入理解Spring》:现代Java开发的核心框架
Spring自2003年诞生以来,已成为Java企业级开发的基石,凭借IoC、AOP、声明式编程等核心特性,极大简化了开发复杂度。本系列将深入解析Spring框架核心原理及Spring Boot、Cloud、Security等生态组件,助力开发者构建高效、可扩展的应用体系。(238字)
|
9月前
|
Java
Java语言实现字母大小写转换的方法
Java提供了多种灵活的方法来处理字符串中的字母大小写转换。根据具体需求,可以选择适合的方法来实现。在大多数情况下,使用 String类或 Character类的方法已经足够。但是,在需要更复杂的逻辑或处理非常规字符集时,可以通过字符流或手动遍历字符串来实现更精细的控制。
540 18
|
9月前
|
存储 Java 索引
用Java语言实现一个自定义的ArrayList类
自定义MyArrayList类模拟Java ArrayList核心功能,支持泛型、动态扩容(1.5倍)、增删改查及越界检查,底层用Object数组实现,适合学习动态数组原理。
392 4
|
10月前
|
存储 Java Apache
Java语言操作INI配置文件策略
以上步骤展示了基本策略,在实际项目中可能需要根据具体需求进行调整优化。例如,在多线程环境中操作同一份配置时需要考虑线程安全问题;大型项目可能还需考虑性能问题等等。
383 15
|
10月前
|
消息中间件 人工智能 Java
抖音微信爆款小游戏大全:免费休闲/竞技/益智/PHP+Java全筏开源开发
本文基于2025年最新行业数据,深入解析抖音/微信爆款小游戏的开发逻辑,重点讲解PHP+Java双引擎架构实战,涵盖技术选型、架构设计、性能优化与开源生态,提供完整开源工具链,助力开发者从理论到落地打造高留存、高并发的小游戏产品。
|
11月前
|
JavaScript 安全 前端开发
Java开发:最新技术驱动的病人挂号系统实操指南与全流程操作技巧汇总
本文介绍基于Spring Boot 3.x、Vue 3等最新技术构建现代化病人挂号系统,涵盖技术选型、核心功能实现与部署方案,助力开发者快速搭建高效、安全的医疗挂号平台。
473 3
|
11月前
|
安全 Java 数据库
Java 项目实战病人挂号系统网站设计开发步骤及核心功能实现指南
本文介绍了基于Java的病人挂号系统网站的技术方案与应用实例,涵盖SSM与Spring Boot框架选型、数据库设计、功能模块划分及安全机制实现。系统支持患者在线注册、登录、挂号与预约,管理员可进行医院信息与排班管理。通过实际案例展示系统开发流程与核心代码实现,为Java Web医疗项目开发提供参考。
479 2
|
10月前
|
存储 Java 关系型数据库
Java 项目实战基于面向对象思想的汽车租赁系统开发实例 汽车租赁系统 Java 面向对象项目实战
本文介绍基于Java面向对象编程的汽车租赁系统技术方案与应用实例,涵盖系统功能需求分析、类设计、数据库设计及具体代码实现,帮助开发者掌握Java在实际项目中的应用。
380 0

热门文章

最新文章

相关产品

  • 检索分析服务 Elasticsearch版