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

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 带你读《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

 

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
8天前
|
SQL 安全 Java
安全问题已经成为软件开发中不可忽视的重要议题。对于使用Java语言开发的应用程序来说,安全性更是至关重要
在当今网络环境下,Java应用的安全性至关重要。本文深入探讨了Java安全编程的最佳实践,包括代码审查、输入验证、输出编码、访问控制和加密技术等,帮助开发者构建安全可靠的应用。通过掌握相关技术和工具,开发者可以有效防范安全威胁,确保应用的安全性。
21 4
|
10天前
|
缓存 监控 Java
如何运用JAVA开发API接口?
本文详细介绍了如何使用Java开发API接口,涵盖创建、实现、测试和部署接口的关键步骤。同时,讨论了接口的安全性设计和设计原则,帮助开发者构建高效、安全、易于维护的API接口。
32 4
|
20天前
|
开发框架 JavaScript 前端开发
HarmonyOS UI开发:掌握ArkUI(包括Java UI和JS UI)进行界面开发
【10月更文挑战第22天】随着科技发展,操作系统呈现多元化趋势。华为推出的HarmonyOS以其全场景、多设备特性备受关注。本文介绍HarmonyOS的UI开发框架ArkUI,探讨Java UI和JS UI两种开发方式。Java UI适合复杂界面开发,性能较高;JS UI适合快速开发简单界面,跨平台性好。掌握ArkUI可高效打造符合用户需求的界面。
71 8
|
15天前
|
SQL Java 程序员
倍增 Java 程序员的开发效率
应用计算困境:Java 作为主流开发语言,在数据处理方面存在复杂度高的问题,而 SQL 虽然简洁但受限于数据库架构。SPL(Structured Process Language)是一种纯 Java 开发的数据处理语言,结合了 Java 的架构灵活性和 SQL 的简洁性。SPL 提供简洁的语法、完善的计算能力、高效的 IDE、大数据支持、与 Java 应用无缝集成以及开放性和热切换特性,能够大幅提升开发效率和性能。
|
16天前
|
存储 Java 关系型数据库
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接创建、分配、复用和释放等操作,并通过电商应用实例展示了如何选择合适的连接池库(如HikariCP)和配置参数,实现高效、稳定的数据库连接管理。
33 2
|
16天前
|
监控 Java 数据库连接
在Java开发中,数据库连接管理是关键问题之一
在Java开发中,数据库连接管理是关键问题之一。本文介绍了连接池技术如何通过预创建和管理数据库连接,提高数据库操作的性能和稳定性,减少资源消耗,并简化连接管理。通过示例代码展示了HikariCP连接池的实际应用。
17 1
|
9天前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
19 0
|
9天前
|
Java API Android开发
kotlin和java开发优缺点
kotlin和java开发优缺点
24 0
WK
|
15天前
|
开发框架 移动开发 Java
C++和Java哪个更适合开发移动应用
本文对比了C++和Java在移动应用开发中的优劣,从市场需求、学习难度、开发效率、跨平台性和应用领域等方面进行了详细分析。Java在Android开发中占据优势,而C++则适合对性能要求较高的场景。选择应根据具体需求和个人偏好综合考虑。
WK
30 0
WK
|
16天前
|
安全 Java 编译器
C++和Java哪个更适合开发web网站
在Web开发领域,C++和Java各具优势。C++以其高性能、低级控制和跨平台性著称,适用于需要高吞吐量和低延迟的场景,如实时交易系统和在线游戏服务器。Java则凭借其跨平台性、丰富的生态系统和强大的安全性,广泛应用于企业级Web开发,如企业管理系统和电子商务平台。选择时需根据项目需求和技术储备综合考虑。
WK
18 0

相关产品

  • 检索分析服务 Elasticsearch版