带你读《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;
相关文章
|
8月前
|
缓存 监控 前端开发
顺企网 API 开发实战:搜索 / 详情接口从 0 到 1 落地(附 Elasticsearch 优化 + 错误速查)
企业API开发常陷参数、缓存、错误处理三大坑?本指南拆解顺企网双接口全流程,涵盖搜索优化、签名验证、限流应对,附可复用代码与错误速查表,助你2小时高效搞定开发,提升响应速度与稳定性。
|
10月前
|
JSON Java API
【干货满满】分享京东API接口到手价,用Java语言实现
本示例使用 Java 调用京东开放平台商品价格及优惠信息 API,通过商品详情和促销接口获取到手价(含优惠券、满减等),包含签名生成、HTTP 请求及响应解析逻辑,适用于比价工具、电商系统集成等场景。
|
人工智能 安全 Java
智慧工地源码,Java语言开发,微服务架构,支持分布式和集群部署,多端覆盖
智慧工地是“互联网+建筑工地”的创新模式,基于物联网、移动互联网、BIM、大数据、人工智能等技术,实现对施工现场人员、设备、材料、安全等环节的智能化管理。其解决方案涵盖数据大屏、移动APP和PC管理端,采用高性能Java微服务架构,支持分布式与集群部署,结合Redis、消息队列等技术确保系统稳定高效。通过大数据驱动决策、物联网实时监测预警及AI智能视频监控,消除数据孤岛,提升项目可控性与安全性。智慧工地提供专家级远程管理服务,助力施工质量和安全管理升级,同时依托可扩展平台、多端应用和丰富设备接口,满足多样化需求,推动建筑行业数字化转型。
437 5
|
8月前
|
Java
Java语言实现字母大小写转换的方法
Java提供了多种灵活的方法来处理字符串中的字母大小写转换。根据具体需求,可以选择适合的方法来实现。在大多数情况下,使用 String类或 Character类的方法已经足够。但是,在需要更复杂的逻辑或处理非常规字符集时,可以通过字符流或手动遍历字符串来实现更精细的控制。
494 18
|
8月前
|
存储 Java 索引
用Java语言实现一个自定义的ArrayList类
自定义MyArrayList类模拟Java ArrayList核心功能,支持泛型、动态扩容(1.5倍)、增删改查及越界检查,底层用Object数组实现,适合学习动态数组原理。
350 4
|
9月前
|
存储 Java Apache
Java语言操作INI配置文件策略
以上步骤展示了基本策略,在实际项目中可能需要根据具体需求进行调整优化。例如,在多线程环境中操作同一份配置时需要考虑线程安全问题;大型项目可能还需考虑性能问题等等。
352 15
|
11月前
|
存储 搜索推荐 算法
Java 大视界 -- Java 大数据在智能金融理财产品风险评估与个性化配置中的应用(195)
本文深入探讨了Java大数据技术在智能金融理财产品风险评估与个性化配置中的关键应用。通过高效的数据采集、存储与分析,Java大数据技术助力金融机构实现精准风险评估与个性化推荐,提升投资收益并降低风险。
Java 大视界 -- Java 大数据在智能金融理财产品风险评估与个性化配置中的应用(195)
|
11月前
|
监控 Java API
Java语言按文件创建日期排序及获取最新文件的技术
这段代码实现了文件创建时间的读取、文件列表的获取与排序以及获取最新文件的需求。它具备良好的效率和可读性,对于绝大多数处理文件属性相关的需求来说足够健壮。在实际应用中,根据具体情况,可能还需要进一步处理如访问权限不足、文件系统不支持某些属性等边界情况。
465 14
|
10月前
|
算法 Java
Java语言实现链表反转的方法
这种反转方法不需要使用额外的存储空间,因此空间复杂度为,它只需要遍历一次链表,所以时间复杂度为,其中为链表的长度。这使得这种反转链表的方法既高效又实用。
662 0
|
10月前
|
JSON Java API
【干货满满】分享拼多多API接口到手价,用Java语言实现
本方案基于 Java 实现调用拼多多开放平台商品详情 API,通过联盟接口获取商品到手价(含拼团折扣与优惠券),包含签名生成、HTTP 请求及响应解析逻辑,适用于电商比价、导购系统集成。

热门文章

最新文章

相关产品

  • 检索分析服务 Elasticsearch版